为什么这个变量不在咖啡脚本的范围内?

时间:2014-06-14 12:53:37

标签: coffeescript dashing

我正在使用dashing框架来创建窗口小部件。基本上它使用sinatra,蝙蝠侠和咖啡脚本来创建仪表板。

我的代码基于this widget

我有以下代码

咖啡脚本

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,则应用'available'css类,它将div的颜色从红色变为蓝色,如预期的那样。

但是,如果我将访问器函数从“true”更改为变量,则说它未定义。

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

从我对谷歌和堆栈溢出的研究时间来看,问题似乎是范围问题。

我已经尝试将color_available变量的每个实例更改为全局范围而没有运气。

@color_available

我也尝试将color_available添加到窗口

window.color_available = color_available

有人能指出为什么color_available未定义?我是javascript / coffeescript的新手,我有点过头了。


资源

How do I define global variables in CoffeeScript?
https://donatstudios.com/CoffeeScript-Madness

更新

我忘了提到,我已经尝试了以下方法来初始化变量。

startCountdown: =>
  color_available

startCountdown: =>
  @color_available

color_available
startCountdown: =>

color_available = null
startCountdown: =>

1 个答案:

答案 0 :(得分:1)

使用@accessor将字面意思放在原型对象上,这样它就会被共享当然如果你把它添加到每个类的实例中,你可能不希望它是相同的班级的每个实例。我的猜测是Batman正在为你添加这个作为一个实例方法,所以你应该能够在任何可行的地方设置它:

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

可能?我试试看。 FWIW,您可以在不使用@accessor内容的情况下轻松地在纯coffeescript中执行此操作。

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