2015-10-29 4 views
10

I seguenti lavori (il cerchio si sposterà nella nuova posizione nei punti forniti)d3.transition(). Attr ('x', y) non funziona quando d3.attr ('x', y) fa

d3target 
    .attr('cx', newCX) 
    .attr('cy', newCY) 

ma questi non:

d3target 
    .transition() 
    .attr('cx', newCX) 
    .attr('cy', newCY) 
    // .duration(1000) // Still doesn't work with or without the duration 

e né fa questo: (fornendo un valore iniziale as suggested by API docs)

d3target 
    .attr('cx', originalCX) 
    .attr('cy', originalCY) 
    .transition() 
    .attr('cx', newCX) 
    .attr('cy', newCY) 
    // .duration(1000) // Still doesn't work with or without the duration 

I cerchi no animare, né muoversi affatto. Abbiamo provato a impostare manualmente dur su 1 secondo per garantire che l'animazione non stesse finendo o saltando perché era troppo piccola per essere notata o saltata o qualcosa di simile.

Abbiamo provato e considerato molte possibilità sul perché, quindi qualsiasi idea sul perché o su che altro provare è molto apprezzata.

Informazioni di base per riferimento:
Il d3Target appare come segue, e per quello che sappiamo è corretto, dal momento che il primo blocco di codice di opere solo regolando la attr s direttamente senza una chiamata transition().

d3Target description

+3

Puoi pubblicare uno snippet di lavoro? Questo dovrebbe funzionare così il problema sarà altrove. –

+0

puoi dire se stai usando questo codice sul lato server o lato client? la transizione non funziona sul codice lato server (es .: nodejs) –

+0

@Raj Il codice viene servito al client. Il codice esegue il lato client. Abbiamo confermato che d3.select/d3.selectAll funziona e restituisce un oggetto d3 appropriato, quindi il primo blocco di codice funziona. Qualche altro pensiero? –

risposta

0

La transizione funziona utilizzando il seguente codice semplificato:

html:

<svg height='500' width='500'> 
     <circle id='circ' cx='50' cy='50' r='10'></circle> 
    </svg> 

js:

var d3target = d3.select('#circ'); 

d3target 
    .transition() 
    .attr('cx', 100) 
    .attr('cy', 100) 

fiddle

Ciò significa che c'è qualcos'altro nel codice che impedisce la transizione dal lavoro. seguito il link al tuo codice, per quanto posso vedere questo è dove si ha la transizione in corso:

if(this.parentMeasureModel.get('timesRecorded') !== 0) { 
    d3target 
     .attr('cx', newCX) 
     .attr('cy', newCY) 

    setTimeout(function(){ 
     d3target 
     .attr('cx', originalCX) 
     .attr('cy', originalCY) 
    }, dur); 
    // Otherwise we use the standard method 
    } else {  
    d3target.transition() 
     .attr('cx', newCX) 
     .attr('cy', newCY) 
     .duration(dur) 
     .each('end',function() {     // as seen above 
     d3.select(this).       // this is the object 
      transition()       // a new transition! 
      .attr('cx', originalCX) // we could have had another 
      .attr('cy', originalCY) // we could have had another 
      .duration(dur);     // .each("end" construct here. 
     }); 
    } 
} 

La differenza tra i due è il dur variabile e l'ogni metodo. Prova a utilizzare un valore effettivo per la variabile dur e rimuovi ciascun metodo. Se funziona, il problema è lì.

+0

Sfortunatamente questo JS non funziona. Un problema è che stiamo cambiando i beat che vengono presentati. Quindi animiamo i beat usando la stessa funzione. L'arrivo di 'target' e' dur' è corretto e può essere validato inserendo un'istruzione 'debugger'. La tua valutazione che ci deve essere qualcos'altro è probabile. Ma cosa? Finora abbiamo diagnosticato, D3 è la preoccupazione. Questo può essere un'ipotesi, ma si basa su anni di esperienza con D3 e la verifica di ogni blocco di codice funziona o no. Sto ancora lavorando a un Plnkr, e quasi lì. –

+0

Come indica il tuo codice, stiamo controllando se è stato sostituito o meno, quindi possiamo usare il normale 'transition()' quando è normale, e possiamo usare 'setTimeout()' (la nostra attuale patch per i duct tape) per animare finché non riusciamo a capire la causa della discrepanza. Puoi vedere all'interno di questa funzione che il 'd3target' rimane SAME, così come' dur', tuttavia l'implementazione dell'animazione deve cambiare perché non sta funzionando nel caso "registrato". Giusto per confermare, il d3target è "corretto" per quanto ne sappiamo e in base alla sua visualizzazione nel terminale per la sua struttura. –

+0

Ho dato un'occhiata ma è difficile capire dove altro potrebbe andare storto senza vedere come viene chiamato. Mi piacerebbe aiutarti, è un problema interessante. Aspetterò che il tuo plunkr abbia un'idea migliore. –

2

Prima assegnare il transito (ritorno del metodo di transizione) a una variabile, quindi provare console.log(transition_selection.empty()). Se è falso, allora sai che hai qualcosa da cambiare.

secondo tentativo: transition_selection.each('start', function(){ console.log('started'); }).each('interrupt', function() {console.log('interrupted');}).each('end', function(){ console.log('ended'); });

In questo modo sarete in grado di vedere se la transizione è stato avviato ed è stata interrotta.

terzo tentativo: transition.attr('cx', function (d) { console.log('attr got assigned');) });

In questo modo si saprà se il valore fornito per 'cx' stato letto.

Effettivamente, prova tutto quanto sopra nella stessa sessione. In modo che tu possa vedere cosa succede in quale ordine.

Provare sempre a denominare le transizioni.d3traget.transition('somename')

In questo modo è possibile eseguire molte transizioni sulla stessa selezione in parallelo. Se si eseguono più transizioni "senza nome" sulla stessa selezione, la seconda transizione interromperà la prima.

Spero che tutto ciò che ti ho dato ti aiuterà a risolvere il tuo problema. In bocca al lupo!