【问题标题】:Why is this variable not in scope in coffee script?为什么这个变量不在咖啡脚本的范围内?
【发布时间】:2014-06-17 02:08:27
【问题描述】:

我正在使用dashing 框架来创建一个小部件。基本上,它使用 sinatra、batman 和 coffee 脚本来创建仪表板。

我的代码基于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 的颜色按预期从红色变为蓝色。

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

  ....
  @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: =>

【问题讨论】:

    标签: coffeescript dashing


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-21
      • 2012-10-10
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多