2013-09-05 3 views
2

Пример «фиксированной длины» хорошо работает.d3.js динамически создает функции кисти

я в настоящее время есть массив щеток (который я использую для гистограмм), для которых я определить в массиве:

вар brushFunctionArray = [brush0, brush1, brush2];

Я иду через петлю гистограммы для создания гистограмм и для каждой кисти я использую:

var brush = d3.svg.brush() 
       .x(x) 
       .on("brush", brushFunctionArray[i]); 

И я определяю кисти, как так:

function brush0() {brushmove(0);} 
function brush1() {brushmove(1);} 
function brush2() {brushmove(2);} 

Тогда есть одно определение brushmove:

function brushmove(index){ 
    ... 
    ... 
} 

Это прекрасно работает. НО, я хочу иметь возможность заставить массив во время выполнения двигаться дальше фиксированной длины (brush0 ... brushB). Я пытался создать функции динамически:

var brushFunctionArray = []; 

for (var i = 0; i < numOfHistograms; i++){ 
    var func = new Function("return function brush" + i + " () {brushmove("+i+");}")(); 
    brushFunctionArray.push(func); 
} 

Это создает функцию и вставляет их в массив, но я не могу достаточно использовать brushFunctionArray в .on («кисть», ..), как и раньше, потому что функции там, а не имена функций. Плюс, когда я помещаю функции в массив, я больше не инициализирую их.

Спасибо за любые предложения!

ответ

0

Вы должны быть в состоянии использовать их как хотите, вставив анонимные (т. Е. Неназванные) функции в свой массив.

var brushFunctionArray = []; 
for (var i = 0; i < numOfHistograms; i++){ 
    brushFunctionArray.push(function() { brushmove(i); }); 
} 
+0

Если вы используете анонимную функцию, вы получите сообщение об ошибке при попытке переместить любой из кистей: неперехваченным TypeError: Не удается вызвать метод «степень» неопределенных Вы должны каким-то образом имеют имена функций в там brush0, brush1, ... – SOUser

+0

Работает отлично для меня - http://jsfiddle.net/Es3jx/ У вас есть полный пример где-нибудь? –