2009-07-31 6 views
12

Comment supprimer un événement dojo connected si vous n'avez pas le "handle" qui a été retourné pendant le dojo.connect?Comment supprimer un événement dojo connected si vous n'avez pas le "handle" qui a été retourné pendant le dojo.connect?

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). Maintenant, en fonction des désirs/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, ce qui suit ne fonctionnera pas: dojo.disconnect(row, "onclick", ??*). Comment est-ce que je contourne ceci sans hacker la structure originale de rangée?

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

Répondre

9

Ce que je fais habituellement est de sauvegarder les poignées quand je les crée afin que je puisse les déconnecter plus tard. 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) { .... }); 
}); 

Puis plus tard, vous pouvez vous déconnecter comme:

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

Il y a un exemple de code similaire pour cela sur dojocampus

+0

connects [node.id] est undefined => vous devez d'abord lui assigner {} ou []. –

+0

merci. réponse mise à jour. – seth

+0

Cette réponse est marquée comme correcte, mais elle ne semble pas répondre à la question car elle dépend toujours des poignées. – moliveira

9

Comme Seth je mes modèles pour la suppression des événements — I collecter des poignées dans des tableaux (pseudo-code):

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

Si je me connecte dynamiquement je les collectionne:

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

Si je me connecte plusieurs événements d'une 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 tous avec en une ligne à portée de main:

dojo.forEach(handles, dojo.disconnect); 

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

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

donc plus tard que vous pouvez déconnecter les gestionnaires comme ceci:

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

Voir si Seth » et mes croquis aider dans votre cas. Si non, donnez-nous plus de détails.

10

La réponse à votre question est qu'il est impossible de déconnecter un événement si vous avez perdu le "handle" qui a été retourné pendant l'opération dojo.connect. Sauf si vous êtes prêt à faire du piratage lourd du code dojo lui-même.

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

2

Même si dojo ne dispose pas d'une façon de faire, vous pouvez supprimer une fonction nommée avec JavaScript standard:

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

See it in action here.Toutefois, removeEventListener n'est pris en charge qu'à partir d'IE9 pour Internet Explorer. Cela devrait fonctionner sur tous les autres principaux navigateurs.

0

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

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

Tous et toutes les fonctions attachées au gestionnaire click pour ce widget sera remplacé par votre nouvelle cliquez sur gestionnaire.

Questions connexes