Come si rimuove un evento connesso dojo se non si dispone del "handle" che è stato restituito durante il dojo.connect?

StackOverflow https://stackoverflow.com/questions/1214624

  •  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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top