2015-05-12 5 views
0

У меня есть силовой график D3, который имеет функциональность на tick. Я заметил, что как только график остановится, функциональность будет потеряна до тех пор, пока она не будет перемещена снова. Мне интересно, как предотвратить это или как всегда есть tick?Как иметь бесконечный тик?

В качестве примера, у меня есть следующий код

force.on("tick", function() { 
    link.attr("x1", function(d) { return d.source.x; }) 
      .attr("y1", function(d) { return d.source.y; }) 
      .attr("x2", function(d) { return d.target.x; }) 
      .attr("y2", function(d) { return d.target.y; }); 

    node.attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; }); 
    node.style("fill", function(d) { if (d.selected===true) {return "yellow"} else return d.data['color'] }).select("circle").style("stroke", "black"); 
}); 

// highlight node on dblclick 
function highlight(d) { 
if (d.selected == false) { 
    d.selected = true; 
} 
else { 
    d.selected = false; 
} 
} 

Он постоянно проверяет данные элементы узла ли selected (из JSON) атрибута является истинным или ложным. Если это правда, то он превращает узел в желтый цвет. Я заметил, что как только график по-прежнему остается, и вы дважды щелкните его, он не станет желтым узлом, пока вы снова не сдвинете график.

+0

Основываясь на предоставленной вами информации, я не думаю, что это будет хорошая идея, чтобы сила выполнялась бесконечно (что вы могли бы, контролируя фактор 'alpha', btw). Почему бы вам не перевести вызов на 'node.style (« fill », ...)' на вашу функцию двойного щелчка? Таким образом, анимация может перестать работать с функциональностью обработчика. – altocumulus

+0

Я не уверен, почему я не думал об этом в первую очередь. Благодарю. Я добавил, что 'node.style ...' заполняет функцию 'highlight()', и я думаю, похоже, что у этого есть функциональность того, что мне нужно сделать. Я не могу вспомнить свой процесс мышления, потому что мне нужно поставить его в галочку, так что сейчас это работает. – Joey

+0

Я не могу сказать, так жаль, что это в ответах. Пробовали ли вы вызов force.start(), когда галочка закончилась? Или через определенное время? – thatOneGuy

ответ

0

Событие tick генерируется маской силы при изменении ее внутреннего состояния, то есть при перемещении узлов. В какой-то момент силовое моделирование достигнет точки равновесия, где все силы, действующие на узлы, будут сбалансированы, и вы не увидите никакого дальнейшего движения. На этом этапе не будет создано больше событий tick.

Есть способы «растянуть» время, необходимое для достижения равновесия, но вы не можете отложить это на неопределенный срок, если не нарушите узлы, чтобы разбалансировать силы.

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

+0

Есть ли способ передать несколько функций обработчику кликов? Например, если у вас есть '.on (« click », ...)' и другой '.on (« click », ...), второй будет переопределять первый. – Joey

+0

Да, просто вызовите обе функции: .on ("click", function() {a(); b();}) '. –