2009-07-31 10 views
12

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

Mi ejemplo implica la asignación dinámica de un conjunto de eventos a un conjunto de objetos. (para simplificar, los eventos son onclick y ondblclick, y los objetos son filas dentro de una tabla)

Por lo tanto, 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?

Por supuesto, cualquier ayuda es muy apreciada.

Respuesta

9

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, más tarde, en la que se puede desconectar, como:

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

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

+0

conecta [node.id] no está definido => tiene que asignarle {} o [] primero. –

+0

gracias. respuesta actualizada – seth

+0

Esta respuesta está marcada como correcta, pero no parece responder a la pregunta, ya que aún depende de los identificadores. – moliveira

9

Al igual que Seth tengo mis patrones para la eliminación de eventos — I recoger identificadores en matrices (pseudocódigo):

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

Si conecto dinámicamente que los recolecte:

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

Si conecto varios eventos en forma regular que puede utilizar dojo.map():

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

La parte interesante es que después puedo desconectar a todos con un práctico de una sola línea:

dojo.forEach(handles, dojo.disconnect); 

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

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

Así que después, uno puede desconectar manipuladores de la siguiente manera:

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

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

10

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 gran pirateo del código dojo.

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

2

Aunque dojo no tiene manera de hacer esto, puede eliminar una función llamada con el estándar de JavaScript:

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

See it in action here.Sin embargo, removeEventListener solo es compatible con IE9 para Internet Explorer. Debería funcionar en todos los otros navegadores principales.

0

Si el evento está conectado a un widget Dijit, puede anular todos los controladores en el caso de este modo:

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

Cualquier y todas las funciones conectados al controlador de click para ese widget será reemplazado por el nuevo haga clic en controlador.

Cuestiones relacionadas