0

私はコーヒースクリプトでこれをやろうとしています、

http://jsfiddle.net/Q6348/8/

具体的には、jQWordCloud にハンドラーを追加して、クリックされている単語のラベルを取得しようとしています

私のcoffeescriptバージョンでは

while i < @counts.length
  x = @counts[i]
  @tag_list.push
    text: x.label
    weight: x.count
    handlers:
      click: ->
        temp = x
        ->
          alert "it worked for " + temp.label
      ()
  ++i

おそらく () が原因で予期しない TERMINATOR エラーが発生しますが、jsfiddle で気付いた場合は、それを削除するとハンドラーが壊れます

4

1 に答える 1

1

この問題に対する通常の CoffeeScript のアプローチは、以下を使用することdoです。

JavaScript ループを使用して関数を生成する場合、ループ変数が確実に閉じられるようにするためにクロージャー ラッパーを挿入するのが一般的であり、生成されたすべての関数が最終的な値を共有するだけではありません。CoffeeScript はdoキーワードを提供します。このキーワードは、渡された関数をすぐに呼び出し、引数を転送します。

for ... in次に、ループの代わりにプレーンを使用whileして、インデックスをいじる必要がないようにします。このようなもの:

for o in stuff
  do (o) ->
    tag_list.push
      text: o.NAME
      weight: o.COUNT
      html:
        title: "#{o.COUNT} varieties"
      handlers:
        click: -> console.log("it worked for", o)

デモ: http://jsfiddle.net/ambiguous/3W9YC/

または、次のようなループ内包表記を使用できます。

tag_list = for o in stuff
  do (o) ->
    text: o.NAME
    weight: o.COUNT
    html:
      title: "#{o.COUNT} varieties"
    handlers:
      click: -> console.log("it worked for", o)

呼び出しを避けpushます。

デモ: http://jsfiddle.net/ambiguous/3W9YC/1/

ところで、jsfiddle.net で CoffeeScript を使用するには、サイドバーの [言語] パネルで選択します。

于 2013-08-04T21:54:08.223 に答える