0

我正在使用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,则应用 'available' css 类,它将 div 的颜色按预期从红色变为蓝色。

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

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

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

我尝试将 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: =>
4

1 回答 1

1

使用@accessor是把它放在原型对象上,所以它会被共享当然,如果你将它添加到类的每个实例中,你可能不希望它对于类的每个实例都是相同的。我的猜测是蝙蝠侠正在为你添加这个作为实例方法,所以你应该能够在任何可能有意义的地方设置它:

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

也许?我会试试的。FWIW,您可以很容易地在纯咖啡脚本中做到这一点,而无需使用这些@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
于 2014-06-16T18:08:27.027 回答