2013-07-18 3 views
3

Afraid Я делаю простую ошибку в том, как преобразовать этот JavaScript в CoffeeScript в классеПеревести d3.js JavaScript функция CoffeeScript

В этом original example of a world map мы имеем функцию:

var quantize = d3.scale.quantize() 
    .domain([0, .15]) 
    .range(d3.range(9).map(function(i) { return "q" + i + "-9"; })); 

Это называется тогда, когда карта оказывается:

.attr("class", function(d) { return quantize(rateById.get(d.id)); }) 

И мы остались с чем-то вроде class="q8-9 который является то, что мы хотим.

Преобразования этого CoffeeScript у меня есть:

quantize: -> 
    d3.scale.quantize() 
    .domain([0, .15]) 
    .range(d3.range(9).map((i) -> "q" + i + "-9")) 

Что я тогда назвать так:

.attr("class", (d) => @quantize(rateById.get(d.id))) 

Однако это does't возвращает значение, а она возвращает функцию масштаба, оставив меня с этим:

class="function scale(x) { return range[Math.max(0, Math.min(i, Math.floor(kx * (x - x0))))]; }"

Я уверен, что я делая что-то очень простое, но не может понять это. Вы можете помочь?

ответ

3

Вместо

quantize: -> 
    d3.scale.quantize() 
    .domain([0, .15]) 
    .range(d3.range(9).map((i) -> "q" + i + "-9")) 

вы хотите

quantize : 
    d3.scale.quantize() 
    .domain([0, .15]) 
    .range(d3.range(9).map((i) -> "q" + i + "-9")) 

-> используется, когда вы определяете функции, но здесь вы просто вызов функции (это просто происходит, чтобы вернуть функции), так что его похожим его коллеге JavaScript.

Примечание: Судя по тому, что вы имели : -> начать с и @quantize что переводится this.quantize, это выглядит, как вы храните quantize в объекте, который является большим, и это то, что выше код предполагает. Если ваш код на самом деле больше похож на исходный пример, связанный с тем, где квантование - это просто переменная, тогда вам понадобятся quantize = d3... и quantize(rateId.get(d.id)) (без @).

Ссылка «Try CoffeeScript» в верхней части CoffeeScript site позволяет писать CoffeeScript, и это переведёт на JavaScript по мере того, как вы идете, что является отличным способом узнать и понять, что трансформируется в что. Также доступны плагины для браузеров, которые делают это.

+0

Спасибо. И ваш ответ, и работа @ edi9999, так что это сложный призыв принять! Вы правильно определили, что я храню квантование в объекте, поэтому я пойду с этим ;-). –

3

В вашем коде Javascript, квантование содержит значение:

var quantize = d3.scale.quantize() 
    .domain([0, .15]) 
    .range(d3.range(9).map(function(i) { return "q" + i + "-9"; })); 

Но в вашей версии CoffeeScript, квантование является функция:

quantize: -> 
    d3.scale.quantize() 
    .domain([0, .15]) 
    .range(d3.range(9).map((i) -> "q" + i + "-9")) 

Вы должны, вероятно, просто сделать:

quantize = d3.scale.quantize() 
    .domain([0, .15]) 
    .range(d3.range(9).map((i) -> "q" + i + "-9")) 

, так что квантование остается функцией.

Вы должны удалить @ из @quantize, что переводит в Javascript на this.quantize, поскольку квантование кажется переменной, а не свойством. Difference between properties and variables

Смежные вопросы