Wie entfernen Sie ein Dojo verbunden Ereignis, wenn Sie den „Griff“ nicht haben, die während der dojo.connect zurückgegeben wurde?

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

  •  06-07-2019
  •  | 
  •  

Frage

Wie Sie einen Dojo verbunden Ereignis entfernen, wenn Sie den „Griff“ nicht haben, die während der dojo.connect zurückgegeben wurden?

Mein Beispiel beinhaltet dynamisch eine Reihe von Ereignissen zu einer Menge von Objekten zuweisen. (Der Einfachheit halber sind die Ereignisse Onclick und ondblclick, und die Objekte sind Zeilen innerhalb einer Tabelle)

So, während die Seiteneinrichtung Ereignisse werden in jeder Reihe verbunden (Onclick, ondblclick). Nun auf Benutzer je begehrt / Aktionen, ein Bedürfnis nach Entfernung eines Ereignisses von einer Zeile erforderlich ist. Aber die ursprüngliche Handle ist nicht mehr verfügbar. Aus diesem Grund wird folgendes nicht: dojo.disconnect(row, "onclick", ??*). Wie kann ich dieses Problem umgehen, ohne die ursprüngliche Zeilenstruktur Hacking?

Jede Hilfe ist natürlich sehr geschätzt.

War es hilfreich?

Lösung

Was ich in der Regel tun, ist die Griffe sparen, wenn ich schaffen sie, damit ich sie später trennen. So etwas wie:

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

später dann auf Sie trennen wie:

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

Es gibt ein ähnliches Codebeispiel hierfür auf dojocampus

Andere Tipps

Die Antwort auf Ihre Frage ist, dass es unmöglich ist, Ereignis zu trennen, wenn Sie den „Griff“ verloren haben, die während der dojo.connect Betrieb zurückgegeben wurde. Außer, wenn Sie bereit sind, schweren Hacking von Dojo-Code selbst zu tun.

Sie müssen diese irgendwo gespeichert werden, wenn sie wollen später trennen.

Wie Seth Ich habe meine Muster für Ereignisse zu entfernen - ich sammle Griffe in Arrays (Pseudo-Code):

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

Wenn ich dynamisch verbinde ich sie nur sammeln:

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

Wenn ich mehrere Ereignisse in einer regelmäßigen Weise verbinden kann ich dojo.map() verwenden:

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

Das schmucke Teil ist später, dass ich sie alle mit einem praktischen Einzeiler trennen kann:

dojo.forEach(handles, dojo.disconnect);

In Ihrem Fall, dass Sie ein Wörterbuch wie gezeigt von Seth verwenden können, das gleiche zu erreichen:

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

So ein später können Sie Handler wie folgt trennen:

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

, wenn Seth und meine Skizzen in Ihrem Fall helfen. Wenn nicht, geben Sie uns weitere Details.

Auch wenn Dojo haben keine Möglichkeit, dies zu tun, können Sie eine benannte Funktion mit Standard-JavaScript entfernen:

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

es sehen in Aktion hier . Allerdings removeEventListener wird nur als von IE9 für Internet Explorer unterstützt. Es sollte den anderen gängigen Browsern auf allen.

Wenn das Ereignis zu einem Dijit Widget verbunden ist, können Sie alle Handler auf den Fall außer Kraft setzen wie folgt:

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

Jede und alle an den click Handler hinzugefügten Funktionen für das Widget wird von Ihrem neuen Click-Handler ersetzt werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top