javascript - mbostock - d3.js sunburst
Controladores de Coffeescript jQCloud (1)
Estoy tratando de hacer esto en coffeescript,
Específicamente, estoy tratando de agregar controladores a mi jQWordCloud para obtener la etiqueta de la palabra que se hace clic en
En mi versión 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
Obtengo un error TERMINATOR inesperado presumiblemente debido a (), pero si observas en el jsfiddle, eliminar eso rompe el controlador
El enfoque usual de CoffeeScript para este problema es usar do
:
Cuando se utiliza un bucle de JavaScript para generar funciones, es común insertar un contenedor de cierre para garantizar que las variables de bucle se cierren, y que todas las funciones generadas no solo compartan los valores finales. CoffeeScript proporciona la palabra clave
do
, que invoca de inmediato una función aprobada, reenviando cualquier argumento.
Luego use simplemente un plano for ... in
vez del ciclo while para que no tenga que ensuciar los índices; algo más como esto:
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)
Demostración: http://jsfiddle.net/ambiguous/3W9YC/
O podrías usar una comprensión de bucle como esta:
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)
y evitar las llamadas push
.
Demostración: http://jsfiddle.net/ambiguous/3W9YC/1/
Por cierto, puede usar CoffeeScript en jsfiddle.net seleccionándolo en el panel Idiomas en la barra lateral.