2014-12-20 8 views
5

Apprendimento di d3 e quando creo una semplice matrice di numeri, quindi tentare di associare i dati a un semplice insieme di elementi, ma utilizzare la funzione chiave, che attraversa il ciclo due volte. La prima volta, mi dice che i valori dell'array sono indefiniti. La seconda volta sono disponibili.Funzione chiave D3.js in esecuzione due volte su semplice selettore/matrice combo

Ecco il codice html:

<div class="testBind"></div> 
<div class="testBind"></div> 
<div class="testBind"></div> 

Ed ecco il JS:

var numbers = [1, 2, 3]; 

function whichNumber(n){ 
    console.log('n----:' + n); 
    return n; 
} 

var testKeyFunction = d3.selectAll("div.testBind").data(numbers, whichNumber); 

Quando eseguo questo, ottengo:

n----:undefined 
n----:undefined 
n----:undefined 
n----:1 
n----:2 
n----:3 

Ecco un violinista: http://jsfiddle.net/5f8mo2sa/3/

Il rea figlio questo è un problema (a parte il wtf) è perché quando i dati sono una matrice di oggetti e provo a fare riferimento a una chiave nella funzione, lancia un errore indefinito.

+0

Hanno trovato questa grande spiegazione di come selectAll crea una selezione virtuale quando non ci sono elementi sulla pagina, ma questo lascia ancora la domanda di cui sopra senza risposta. Perché esegue il ciclo una volta per ciascun elemento reale, ma non applica i dati? https://www.dashingd3js.com/binding-data-to-dom-elements – ofthewolf

+0

Hanno anche trovato una spiegazione su come aggirare il problema quando si utilizza una serie di oggetti: http://stackoverflow.com/ questions/14149145/join-existing-elements-of-the-dom-to-data-with-d3-js Ma questo non spiega ancora cosa sta succedendo qui o perché. – ofthewolf

risposta

4

Dalla aiuto d3:

Una funzione chiave può essere specificato per controllare come il dato è unito agli elementi. Questo sostituisce il comportamento predefinito per indice; la chiave function is invoked once for each element in the new data array, and once again for each existing element in the selection. In entrambi i casi la funzione chiave è passata il dato d e l'indice i. Quando la funzione chiave viene valutata su nuovi elementi di dati, il contesto è l'array di dati; quando la funzione chiave viene valutata sulla selezione esistente, il contesto è l'elemento DOM associato.

Quello che state vedendo nel primo ciclo sta attraversando i dati esistenti (che non v'è nessuno), poi si passa attraverso il nuovo array di dati (che ha i valori che ci si aspetta). Se la funzione chiave dipende da un oggetto, è necessario prima eseguire un controllo per assicurarsi che l'oggetto esista.

+0

http://jsfiddle.net/qd6phxur/1/ Qui posso vedere i vari valori durante il ciclo. Quindi, se lo scopo della seconda volta nel ciclo è quello di restituire i dati che si desidera associare all'elemento, qual è lo scopo di questo primo ciclo in cui "questo" è impostato sull'elemento esistente? – ofthewolf

+0

d3 sta determinando quali elementi sono stati inseriti o aggiornati o rimossi. Dal momento che la funzione indice può essere dinamica, la esegue sui dati esistenti e sui nuovi dati per determinare come dovrebbe fare il join. Il '.enter()' viene eseguito per i nuovi dati, '.exit()' viene eseguito per i dati rimossi. – Bill