Comment supprimer un événement connecté dojo si vous ne disposez pas du «descripteur» renvoyé lors de la connexion dojo.connect?
-
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.
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.