2009-07-31 3 views
12

Come si rimuove un evento collegato al dojo se non si dispone del "quadratino" restituito durante il dojo.connect?Come si rimuove un evento collegato al dojo se non si ha il "quadratino" che è stato restituito durante il dojo.connect?

Il mio esempio comporta l'assegnazione dinamica di un insieme di eventi a un insieme di oggetti. (per semplicità, gli eventi sono onclick e ondblclick e gli oggetti sono righe all'interno di una tabella)

Quindi, durante gli eventi di configurazione della pagina sono collegati a ciascuna riga (onclick, ondblclick). Ora, in base ai desideri/azioni dell'utente, è necessaria la rimozione di un evento da una riga. Ma l'handle originale non è più disponibile. Per questo motivo, non funziona: dojo.disconnect(row, "onclick", ??*). Come posso aggirare questo senza aver hackerato la struttura originale delle righe?

Qualsiasi aiuto è ovviamente molto apprezzato.

risposta

9

Quello che faccio di solito è salvare le maniglie quando le creo così posso disconnetterle in seguito. Qualcosa di simile:

var connects = {}; 

// then later on 
var node = dojo.create(....); // or someting else that gives you a node 
dojo.forEach(['click','ondblclick' ], function(evt, idx) { 
    if (!connects[node.id]) { 
    connects[node.id] = []; 
    } 
    connects[ node.id ][idx] = dojo.connect(node, evt, function(evt) { .... }); 
}); 

Poi dopo, il è possibile scollegare come:

dojo.forEach(connects[node.id], function(handle) { 
    dojo.disconnect(handle); 
}); 

C'è un esempio di codice simile per questo su dojocampus

+0

connect [node.id] is undefined => devi prima assegnare {} o [] ad esso. –

+0

grazie. risposta aggiornata – seth

+0

Questa risposta è contrassegnata come corretta ma non sembra rispondere alla domanda in quanto dipende ancora dalle maniglie. – moliveira

9

come Seth ho i miei motivi per la rimozione di eventi — I raccogliere gli handle negli array (pseudo-code):

var handles = [ 
    dojo.connect(...), 
    dojo.connect(...), 
    dojo.connect(...) 
]; 

Se mi collego dinamicamente ho solo raccoglierli:

var handles = []; 
... 
handles.push(dojo.connect(...)); 
... 
handles.push(dojo.connect(...)); 

Se mi collego diversi eventi in modo regolare posso usare dojo.map():

var handles = dojo.map(["click", "ondblclick"], function(evt){ 
    return dojo.connect(node, evt, ...); 
}); 

La parte pulita è che poi li tutto quello che posso staccare con un comodo one-liner:

dojo.forEach(handles, dojo.disconnect); 

Nel tuo caso è possibile utilizzare un dizionario come dimostrato da Seth per ottenere la stessa:

var handles = {}; 
... 
handles[node.id] = dojo.map(["click", "ondblclick"], function(evt){ 
    return dojo.connect(node, evt, ...); 
}); 

Così più tardi quello che si può scollegare i gestori in questo modo:

dojo.forEach(handles[node.id], dojo.disconnect); 

Vedi se Seth' e miei schizzi aiutano nel tuo caso. In caso contrario, forniscici maggiori dettagli.

10

La risposta alla tua domanda è che è impossibile disconnettere l'evento se hai perso l'"handle" che è stato restituito durante l'operazione dojo.connect. Tranne se sei pronto a fare un pesante hacking del codice dojo stesso.

È necessario memorizzarli da qualche parte se si desidera scollegarli in seguito.

2

Anche se dojo non dispone di un modo per fare questo, è possibile rimuovere una funzione denominata con JavaScript standard:

node.removeEventListener ("click", clickFunction, false); 

See it in action here.Tuttavia, removeEventListener è supportato solo da IE9 per Internet Explorer. Dovrebbe funzionare su tutti gli altri principali browser.

0

Se l'evento è collegato a un widget Dijit, è possibile ignorare tutti i gestori per l'evento in questo modo:

dijit.byId(widgetid).onClick = function() { 
    // click handler or empty function goes here 
} 

Qualsiasi e tutte le funzioni collegate al gestore click per quel widget sarà sostituito dal nuovo gestore di clic.