Come si rimuove un evento connesso dojo se non si dispone del "handle" che è stato restituito durante il dojo.connect?
-
06-07-2019 - |
Domanda
Come si rimuove un evento connesso dojo se non si dispone di " handle " che è stato restituito durante il dojo.connect?
Il mio esempio prevede l'assegnazione dinamica di una serie di eventi a una serie di oggetti. (per semplicità, gli eventi sono onclick e ondblclick e gli oggetti sono righe all'interno di una tabella)
Quindi, durante l'impostazione della pagina, gli eventi sono collegati ad ogni riga (onclick, ondblclick). Ora, a seconda dei desideri / azioni dell'utente, è necessaria la rimozione di un evento da una riga. Ma la maniglia originale non è più disponibile. Per questo motivo, non funzionerà: dojo.disconnect (row, " onclick " ;, ?? *)
. Come aggirare questo problema senza compromettere la struttura a righe originale?
Qualsiasi aiuto è ovviamente molto apprezzato.
Soluzione
Quello che faccio di solito è salvare gli handle quando li creo in modo da poterli disconnettere in un secondo momento. Qualcosa del tipo:
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) { .... });
});
Quindi, in seguito, puoi disconnetterti come:
dojo.forEach( connects[node.id], function( handle ) {
dojo.disconnect( handle );
});
C'è un esempio di codice simile per questo su dojocampus
Altri suggerimenti
La risposta alla tua domanda è che è impossibile disconnettere l'evento se hai perso la "gestione" che è stato restituito durante l'operazione dojo.connect. Tranne se sei pronto a fare hacking pesante del codice dojo stesso.
È necessario memorizzarli da qualche parte se si desidera disconnetterli in un secondo momento.
Come Seth ho i miei schemi per la rimozione di eventi - raccolgo handle in array (pseudo-codice):
var handles = [
dojo.connect(...),
dojo.connect(...),
dojo.connect(...)
];
Se mi connetto dinamicamente li raccolgo semplicemente:
var handles = [];
...
handles.push(dojo.connect(...));
...
handles.push(dojo.connect(...));
Se collego più eventi in modo regolare posso usare dojo.map ()
:
var handles = dojo.map(["click", "ondblclick"], function(evt){
return dojo.connect(node, evt, ...);
});
La parte chiara è che in seguito posso disconnetterli tutti con un pratico one-liner:
dojo.forEach(handles, dojo.disconnect);
Nel tuo caso puoi usare un dizionario come mostrato da Seth per ottenere lo stesso risultato:
var handles = {};
...
handles[node.id] = dojo.map(["click", "ondblclick"], function(evt){
return dojo.connect(node, evt, ...);
});
Quindi in seguito puoi disconnettere i gestori in questo modo:
dojo.forEach(handles[node.id], dojo.disconnect);
Vedi se Seth 'e i miei schizzi aiutano nel tuo caso. In caso contrario, forniscici maggiori dettagli.
Anche se dojo non ha modo di farlo, puoi rimuovere una funzione con nome con JavaScript standard:
node.removeEventListener ("click", clickFunction, false);
Guardalo in azione qui . Tuttavia, removeEventListener è supportato solo da IE9 per Internet Explorer. Dovrebbe funzionare su tutti gli altri principali browser.
Se l'evento è collegato a un widget Dijit, puoi sovrascrivere tutti i gestori dell'evento in questo modo:
dijit.byId(widgetid).onClick = function() {
// click handler or empty function goes here
}
Qualsiasi e tutte le funzioni associate al gestore clic
per quel widget saranno sostituite dal nuovo gestore dei clic.