2016-07-12 37 views
9

Sto creando una mappa utilizzando il sistema dei moduli. Sono più o meno abituato a D3.js v3, ma mi sto ancora abituando alla v4.Esportazione di riconversione in d3.js v4

Sto tentando di aggiungere un messaggio ma non so come riassociare le esportazioni in V4, in quanto questa funzione non è disponibile ora.

Così per la mia spedizione (_dis) e il mio particolare evento ("changetype"), il rebind in d3 v3 sarebbe giusto prima di tornare alle esportazioni, ad esempio:

d3.mapDots = function (districts){ 

    var _dis = d3.dispatch('changetype'); 

    (...) 

    exports.color = function(_c){ 
     if(!arguments.length) return color; 
     color = _c; 
     return this; 
    };  

    d3.rebind(exports,_dis,"on"); 
    return exports 
    }; 

Qualcuno sa come fare questo in v4? Ho provato a dispatch.apply ma non funziona.

Grazie!

risposta

10

Buona domanda. Sembra che l'oggetto di spedizione abbia in qualche modo changed e che d3.rebind non esista più. Poiché quest'ultimo è andato, sembra che non c'è modo di "copiare" (via d3.rebind) il metodo .on(). Invece devi implementare il tuo. See here come implementato il bostock d3-brush.

Ho messo insieme this jsFiddle per dimostrare come ottenere con D3 v4 quello che stai chiedendo.

Il bit importante sta attuando il metodo .on:

instance.on = function() { 
    var value = dispatcher.on.apply(dispatcher, arguments); 
    return value === dispatcher ? instance : value; 
} 

E, dispacciamento è come questo

dispatcher.call("was_clicked", this, "Hello, Foo!"); 
+0

Grazie per la spiegazione! Ora capisco come funziona meglio ... Anche se la mia spedizione non è ancora attiva. Ho due file diversi (il file principale script.js e un altro solo per creare la mappa in cui 'exports.on = function()' è), pensi che potrebbe essere dovuto a questo? Grazie! – Irene

+0

@Irene Se ho capito la tua domanda ... Non dovrebbe importare che siano in file diversi. Ciò che importa è che 'exports.on = function() {...}' risiede nella funzione di instantiator (nel tuo caso sarebbe all'interno di 'd3.mapDots = function (districts) {...}'). Se questo è il caso, allora il loro essere in file separati non dovrebbe essere un problema, a patto che lo script principale importi correttamente lo script 'mapDots' (se sei in grado di chiamare' d3.mapDots() 'senza errori allora è correttamente importato). – meetamit

+0

Dovresti essere in grado di creare un jsFiddle che riproduca il tuo problema, e questo ti aiuterà a risolverlo. – meetamit