Comment supprimer un événement connecté dojo si vous ne disposez pas du «descripteur» renvoyé lors de la connexion dojo.connect?

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

  •  06-07-2019
  •  | 
  •  

Question

Comment supprimer un événement connecté au dojo si vous ne possédez pas le "handle" " qui a été renvoyé lors de la connexion dojo?

Mon exemple implique l'affectation dynamique d'un ensemble d'événements à un ensemble d'objets. (pour simplifier, les événements sont onclick et ondblclick, et les objets sont des lignes dans une table)

Ainsi, lors de la mise en page, les événements sont connectés à chaque ligne (onclick, ondblclick). Désormais, en fonction des souhaits / actions de l'utilisateur, il est nécessaire de supprimer un événement d'une ligne. Mais la poignée d'origine n'est plus disponible. Pour cette raison, les éléments suivants ne fonctionneront pas: dojo.disconnect (row, "onclick", ?? *) . Comment puis-je contourner ce problème sans pirater la structure de lignes d'origine?

Toute aide est bien sûr grandement appréciée.

Était-ce utile?

La solution

Ce que je fais habituellement, c’est de sauvegarder les descripteurs lors de leur création afin que je puisse les déconnecter ultérieurement. Quelque chose comme:

 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) { .... });
 });

Ensuite, vous pourrez vous déconnecter plus tard, par exemple:

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

Il existe un exemple de code similaire à ce sujet sur le dojocampus

.

Autres conseils

La réponse à votre question est qu'il est impossible de déconnecter un événement si vous avez perdu le "descripteur". qui a été renvoyé lors de l'opération dojo.connect. Sauf si vous êtes prêt à pirater lourdement le code du dojo lui-même.

Vous devez les stocker quelque part si vous souhaitez les déconnecter ultérieurement.

Comme Seth, j'ai mes modèles pour supprimer des événements - je collecte des descripteurs dans des tableaux (pseudo-codes):

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

Si je me connecte dynamiquement, je les collectionne simplement:

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

Si je connecte plusieurs événements de manière régulière, je peux utiliser dojo.map () :

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

La partie intéressante est que plus tard, je peux les déconnecter avec un one-liner bien pratique:

dojo.forEach(handles, dojo.disconnect);

Dans votre cas, vous pouvez utiliser un dictionnaire comme celui montré par Seth pour accomplir la même chose:

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

Donc, plus tard, vous pouvez déconnecter les gestionnaires comme ceci:

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

Voyez si Seth 'et mes croquis vous aident dans votre cas. Sinon, donnez-nous plus de détails.

Même si le dojo ne dispose d'aucun moyen pour ce faire, vous pouvez supprimer une fonction nommée à l'aide de JavaScript standard:

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

Regardez-le en action ici . Cependant, removeEventListener est uniquement pris en charge à partir de IE9 pour Internet Explorer. Cela devrait fonctionner sur tous les autres principaux navigateurs.

Si l'événement est connecté à un widget Dijit, vous pouvez remplacer tous les gestionnaires de l'événement comme suit:

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

Toutes les fonctions attachées au gestionnaire click de ce widget seront remplacées par votre nouveau gestionnaire de clics.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top