Coffeescapet jQCloud处理程序

Coffeescript jQCloud handlers

本文关键字:程序 处理 jQCloud Coffeescapet      更新时间:2023-09-26

我正试图在coffeescript、中做到这一点

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上注意到,删除它会破坏处理程序

解决此问题的常用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)

并且避免CCD_ 5呼叫。

演示:http://jsfiddle.net/ambiguous/3W9YC/1/

顺便说一句,您可以在jsfiddle.net上使用CoffeeScript,方法是在侧边栏的Languages面板中选择它。