2013-05-03 18 views
5

Podczas przesyłania danych przez d3.js, biblioteka dzieli dane na komponenty enter/update/exit, ale odkryłem, że marnujemy sporo obliczeń w dziale aktualizacji dla wartości, które pozostają niezmienione przez ponowne obliczenia i ponowne ustawienie atrybutów na tę samą wartość, która jest już aktualna.d3: Unikać niezmienionych węzłów?

Czy istnieje dobry sposób na dalsze dzielenie "zaktualizowanego" zestawu na zestawy zmienione/niezmienione?

Odpowiedz

1

Możesz dokonać innego wyboru podczas wyboru aktualizacji. To znaczy, zadzwoń ponownie pod numer .selectAll() za pomocą selektora, który pobiera tylko te rzeczy, które wymagają aktualizacji. Zakłada to oczywiście, że możesz wytworzyć taki selektor. Jednym ze sposobów może być robienie wszystkiego za pomocą klas CSS i ustawianie żadnych atrybutów w samym kodzie. Następnie możesz wybrać na podstawie klasy CSS.

Poza tym, naprawdę nic nie można zrobić. Cała idea D3 polega na tym, że wizualizacja jest określana przez dane i jeśli dane pozostają niezmienione, elementy wizualne pozostają również niezmienione.

0

Możesz użyć funkcji d3 filter, aby dodatkowo odfiltrować wartości w oparciu o dowolne wartości. Użyłem tego wzorca w przeszłości:

# 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... 
Powiązane problemy