0

ダッシュフレームワークを使用してウィジェットを作成しています。基本的にはシナトラ、バットマン、コーヒー スクリプトを使用してダッシュボードを作成します。

私のコードはこのウィジェットに基づいています

次のコードがあります

コーヒースクリプト

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?

Google とスタック オーバーフローに関する私の時間の調査から、問題はスコープの問題のようです。

color_available 変数のすべてのインスタンスをグローバルスコープに変更しようとしましたが、うまくいきませんでした。

@color_available

また、ウィンドウに color_available を追加しようとしました

window.color_available = color_available

color_available が定義されていない理由を誰でも指摘できますか? 私はjavascript / coffeescriptを初めて使用し、少し頭がいっぱいです。


資力

CoffeeScript でグローバル変数を定義するにはどうすればよいですか?
https://donatstudios.com/CoffeeScript-マッドネス

アップデート

変数を初期化するために次のアプローチを試したことを忘れていました。

startCountdown: =>
  color_available

startCountdown: =>
  @color_available

color_available
startCountdown: =>

color_available = null
startCountdown: =>
4

1 に答える 1

1

Using @accessor is putting it literally on the prototype object so it would be shared And of course if you add it to every instance of the class, you probably don't want it to be the same for every instance of the class. My guess is that Batman is adding this for you as an instance method, so you should just be able to set it wherever it might make sense to do so:

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

maybe? I'd try that. FWIW, you can do do this in pure coffeescript pretty easily without using the @accessor stuff.

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 に答える