我正在使用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: =>
答案 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