Почему эта переменная не входит в область действия сценария кофе?

Я использую структуру dashing для создания виджета. В основном он использует скрипты Sinatra, Batman и Coffee для создания панели инструментов.

Мой код основан на этом виджете

У меня есть следующий код

сценарий кофе

class Dashing.Countdown extends Dashing.Widget


  ready: ->
    setInterval(@startCountdown, 500)

  startCountdown: =>
    color_available
    current_timestamp   = Math.round(new Date().getTime()/1000)
    end_timestamp       = Math.round( Date.parse($(@node).find(".more-info").html())/1000 )
    seconds_until_end   = end_timestamp - current_timestamp


    if @get('title') > 'Busy'
      # @set('title', 'herpin the derpin')
      color_available = true
    else
      color_available = false

    ...truncated for readability

  @accessor 'isAvailable', ->
    true

HTML

<div class="gridster">
  <ul>
    <li data-row="1" data-col="1" data-sizex="2" data-sizey="1">
      <div 
        data-id="pomodoro" 
        data-view="Countdown" 
        data-title="Herp the Derp" 
        data-end="" 
        data-addclass-available='isAvailable'>
      </div>
    </li>
  </ul>
</div>

Если функция доступа 'isAvailable' возвращает true, то применяется 'доступный' класс css, который меняет цвет div с красного на синий, как и ожидалось.

Однако, если я изменю функцию доступа с «true» на переменную, она скажет, что она не определена.

  ....
  @accessor 'isAvailable', ->
    color_available?

Судя по моим часам исследований в Google и переполнении стека, похоже, что проблема связана с областью действия.

Я безуспешно пытался изменить все экземпляры переменной color_available на глобальную область.

@color_available

Я также пытался добавить color_available в окно

window.color_available = color_available

Кто-нибудь может указать, почему color_available не определен? Я новичок в javascript/coffeescript, и я немного запутался.


Ресурсы

Как определить глобальные переменные в CoffeeScript?
https://donatstudios.com/CoffeeScript-Madness

Обновить

Я забыл упомянуть, что я пробовал следующие подходы к инициализации переменной.

startCountdown: =>
  color_available

startCountdown: =>
  @color_available

color_available
startCountdown: =>

color_available = null
startCountdown: =>

person spuder    schedule 14.06.2014    source источник


Ответы (1)


Использование @accessor буквально помещает его в объект-прототип, чтобы он был общим. И, конечно, если вы добавите его в каждый экземпляр класса, вы, вероятно, не захотите, чтобы он был одинаковым для каждого экземпляра класса. Я предполагаю, что Бэтмен добавляет это для вас как метод экземпляра, поэтому вы должны просто установить его везде, где это может иметь смысл:

myInstance = new Dashing.Countdown()
myInstance.isAvailable() #=> true
myInstance.isAvailable = -> false
myInstance.isAvailable() #=> false

может быть? Я бы попробовал это. FWIW, вы можете сделать это в чистом coffeescript довольно легко, не используя материал @accessor.

class Dashing.Countdown extends Dashing.Widget
  constructor: ({@colorAvailable})->
    @colorAvailable ?= -> false

  isAvailable: @colorAvailable


myInstance = new Dashing.Countdown(colorAvailable: -> true)
myInstance.isAvailable() #=> true
myInstance = new Dashing.Countdown()
myInstance.isAvailable() #=> false
person Jed Schneider    schedule 16.06.2014