2013-05-03 6 views
5

При передаче данных через d3.js библиотека делит данные на компоненты ввода/обновления/выхода, но я обнаружил, что мы тратим много вычислений в разделе обновления для значений, которые не изменяются при повторном вычислении и переустановка атрибутов с тем же значением, которое уже является текущим.d3: Избегайте неизмененных узлов?

Есть ли хороший способ разделить «обновленный» набор на измененные/неизменные наборы?

ответ

1

Вы можете сделать другой выбор в своем выборе для обновления. То есть, снова вызовите .selectAll() с селектором, который доставит вам только то, что нужно обновить. Это, конечно, предполагает, что вы можете создать такой селектор. Один из подходов может заключаться в том, чтобы делать все через классы CSS и не устанавливать никаких атрибутов в самом коде. Затем вы можете выбрать на основе класса CSS.

Кроме того, вы ничего не можете сделать. Вся идея D3 заключается в том, что визуализация определяется данными, и если данные не изменяются, визуальные элементы также остаются неизменными.

0

Вы можете использовать функцию d3 filter для дальнейшего отфильтровывания значений на основе любых произвольных значений. Я использовал этот рисунок в прошлом:

# store the extra value in the DOM to use for filtering later on: 
selection.attr('data-someExtraValue', function(d) { return d.someExtraValue; }); 

# during the 'update' phase, filter out values who's someExtraValue hasn't changed: 
filteredSelection = selection.filter(function(d) { return d.someExtraValue != parseInt(d3.select(this).attr('data-someExtraValue')); }); 

# do updates on the filtered selection rather than the initial selection...