¿Cómo se elimina un evento dojo conectado si no tiene el "identificador" que se devolvió durante el dojo.connect?

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

  •  06-07-2019
  •  | 
  •  

Pregunta

¿Cómo se elimina un evento conectado al dojo si no tiene el " identificador " que fue devuelto durante el dojo.connect?

Mi ejemplo implica asignar dinámicamente un conjunto de eventos a un conjunto de objetos. (por simplicidad, los eventos son onclick y ondblclick, y los objetos son filas dentro de una tabla)

Entonces, durante la configuración de la página, los eventos se conectan a cada fila (onclick, ondblclick). Ahora, dependiendo de los deseos / acciones del usuario, se requiere la eliminación de un evento de una fila. Pero el mango original ya no está disponible. Debido a esto, lo siguiente no funcionará: dojo.disconnect (row, " onclick " ;, ?? *) . ¿Cómo puedo solucionar esto sin hackear la estructura de fila original?

Cualquier ayuda es, por supuesto, muy apreciada.

¿Fue útil?

Solución

Lo que suelo hacer es guardar los identificadores cuando los creo para poder desconectarlos más tarde. Algo así como:

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

Luego, luego, puede desconectarse como:

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

Hay un ejemplo de código similar para esto en dojocampus

Otros consejos

La respuesta a su pregunta es que es imposible desconectar el evento si ha perdido el '' identificador '' que se devolvió durante la operación dojo.connect. Excepto si está listo para hacer un pirateo pesado del código dojo en sí mismo.

Debe almacenarlos en algún lugar si desea desconectarlos más adelante.

Al igual que Seth, tengo mis patrones para eliminar eventos & # 8212; Recopilo identificadores en matrices (pseudocódigo):

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

Si me conecto dinámicamente, solo los recopilo:

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

Si conecto varios eventos de manera regular, puedo usar dojo.map () :

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

La parte clara es que luego puedo desconectarlos a todos con una práctica línea:

dojo.forEach(handles, dojo.disconnect);

En su caso, puede usar un diccionario como se muestra por Seth para lograr lo mismo:

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

Entonces, más tarde, uno puede desconectar controladores como este:

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

Vea si Seth 'y mis bocetos ayudan en su caso. Si no, danos más detalles.

Aunque el dojo no tiene una forma de hacerlo, puede eliminar una función con nombre con JavaScript estándar:

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

Véalo en acción aquí . Sin embargo, removeEventListener solo es compatible a partir de IE9 para Internet Explorer. Debería funcionar en todos los demás navegadores principales.

Si el evento está conectado a un widget Dijit, puede anular todos los controladores en el evento de esta manera:

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

Todas y cada una de las funciones adjuntas al controlador click para ese widget serán reemplazadas por su nuevo controlador de clic.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top