0

我正在尝试在咖啡脚本中做到这一点,

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

具体来说,我正在尝试将处理程序添加到我的 jQWordCloud 以获取被点击单词的标签

在我的咖啡脚本版本中

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,方法是在侧边栏的Languages面板中选择它。

于 2013-08-04T21:54:08.223 回答