2013-05-03 16 views
5

Durante il passing di dati tramite d3.js, la libreria divide i dati in componenti di inserimento/aggiornamento/uscita, ma ho scoperto che sprechiamo una grande quantità di calcoli nella sezione di aggiornamento per valori che sono rimasti invariati dal re-computing e re-impostare gli attributi sullo stesso valore che è già attuale.d3: evitare nodi invariati?

C'è qualche buon modo per dividere ulteriormente il set "aggiornato" in insiemi modificati/invariati?

risposta

1

È possibile eseguire un'altra selezione nella selezione dell'aggiornamento. Cioè, chiama di nuovo .selectAll() con un selettore che ti ottiene solo le cose che devono essere aggiornate. Questo ovviamente presuppone che tu possa produrre un tale selettore. Un approccio potrebbe essere quello di fare tutto attraverso le classi CSS e non impostare attributi nel codice stesso. Quindi puoi selezionare in base alla classe CSS.

A parte questo, non c'è niente che tu possa davvero fare. L'idea alla base di D3 è che la visualizzazione è determinata dai dati e se i dati non vengono modificati, anche gli elementi visivi rimangono invariati.

0

È possibile utilizzare la funzione d3 filter per filtrare ulteriormente i valori in base a qualsiasi valore arbitrario. Ho usato questo modello in passato:

# 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... 
Problemi correlati