2013-08-04 4 views
0

Я пытаюсь сделать это в CoffeeScript,CoffeeScript jQCloud обработчики

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, убрав что ломает обработчик

ответ

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/

Кстати, вы можете использовать CoffeeScript в jsfiddle.net, выбрав его в Языки панели на боковой панели.

+0

Мне пришлось внести небольшие изменения, но это был отличный ответ, спасибо! – Lemonio