2009-07-31 32 views
12

Jak usunąć zdarzenie związane z dojo, jeśli nie masz "uchwytu", który został zwrócony podczas dojo.connect?Jak usunąć zdarzenie związane z dojo, jeśli nie masz "uchwytu", który został zwrócony podczas dojo.connect?

Mój przykład obejmuje dynamiczne przypisywanie zestawu zdarzeń do zestawu obiektów. (dla uproszczenia zdarzeniami są onclick i ondblclick, a obiektami są wiersze w tabeli)

Podczas konferencji strony zdarzenia są połączone z każdym wierszem (onclick, ondblclick). Teraz, w zależności od pragnień/działań użytkownika, wymagana jest konieczność usunięcia jednego zdarzenia z jednego wiersza. Ale oryginalny uchwyt nie jest już dostępny. Z tego powodu następujące czynności nie będą działać: dojo.disconnect(row, "onclick", ??*). Jak obejść ten problem bez zhakowania oryginalnej struktury wierszy?

Każda pomoc jest oczywiście bardzo doceniana.

Odpowiedz

9

Zazwyczaj zapisuję uchwyty podczas ich tworzenia, aby móc je później odłączyć. Coś jak:

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

Następnie później, można odłączyć jak:

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

Jest podobna przykładowy kod do tego na dojocampus

+0

łączy [node.id] jest niezdefiniowany => musisz najpierw przypisać do niego {} lub []. –

+0

dzięki. zaktualizowana odpowiedź. – seth

+0

Ta odpowiedź jest oznaczona jako poprawna, ale wydaje się, że nie odpowiada na pytanie, ponieważ nadal zależy od uchwytów. – moliveira

9

jak Seth mam wzorce do usuwania Wydarzenia — I zbieranie uchwytów w tablicach (pseudokod):

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

Gdybym połączyć dynamicznie po prostu zebrać je:

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

Gdybym połączyć kilka imprez w regularny sposób mogę korzystać dojo.map():

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

Schludny jest to, że później mogę odłączyć je wszystkie poręczne jedna wkładka:

dojo.forEach(handles, dojo.disconnect); 

W twoim przypadku można użyć słownika jak pokazano przez Seta, aby osiągnąć ten sam:

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

więc później można odłączać ładowarki tak:

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

Zobacz, czy Seth”i moje szkice pomóc w Twoim przypadku. Jeśli nie, podaj nam więcej szczegółów.

10

Odpowiedź na pytanie brzmi, że nie można odłączyć zdarzenia, jeśli zgubiłeś "uchwyt", który został zwrócony podczas operacji dojo.connect. Z wyjątkiem tego, że jesteście gotowi na ciężkie hackowanie samego kodu dojo.

Musisz przechowywać je gdzieś, jeśli chcesz je później rozłączyć.

2

Nawet dojo nie ma sposobu, aby to zrobić, można usunąć nazwie funkcji ze standardowym JavaScript:

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

See it in action here.Jednak metoda removeEventListener jest obsługiwana tylko w wersji IE9 dla przeglądarki Internet Explorer. Powinien działać na wszystkich innych głównych przeglądarkach.

0

Jeśli zdarzenie jest podłączony do widgetu Dijit można przesłonić wszystkie ładowarki na razie tak:

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

do wszystkich funkcji dołączone do obsługi click dla tej widget zostaną zastąpione przez nowy obsługi kliknięcia.