2010-06-09 10 views
6

estoy corriendo en un problema utilizando dojo.connect() para conectar un evento 'onclick' con este botón:dojo.connect no se conectará 'onclick' con el botón

<button dojoType="dijit.form.Button" widgetId="inbox_button" id="inbox_button">Inbox</button> 

y la toma de código la conexión es:

var inbox_button=dojo.byId("inbox_button"); 
dojo.connect(inbox_button,'onclick',function(){ 
    var container=dijit.byId("center"); 
    container.addChild(new dijit.layout.ContentPane({region: "left", content: "...", style: "width: 100px;"})) 
}); 

Sin embargo, en lugar de ejecutar la función cuando se hace clic en el botón, cualquier onclick evento activa la función, y termino con una gran cantidad de contenedores niños.

Aunque estoy bastante seguro de la función .Connect() debe estar disponible como parte de la funcionalidad de la base del dojo, he 'obligado' explícitamente:

dojo.require("dojo._base.connect"); 

alguna idea de por qué esto podría estar pasando?

Respuesta

2

Para responder a mi propia pregunta: nunca subestimes el valor de dojo.addOnLoad!

Considero que, dado que el botón se usaba como widget, su ID no se registró hasta después de que Dojo terminó de cargar, y dado que el código de conexión no estaba dentro de un bloque addOnLoad, no pudo encontrar el (no aún cargado) botón. La razón por la que el método se activaba en cada evento de clic se debía a la forma en que Dojo maneja los objetos nulos en la función connect(): los ignora y en su lugar utiliza dojo.global (la versión de dojo de document.window) como objeto.

Espero que esto ayude a cualquier otra persona que se haya encontrado con un problema similar.

12

Como dices, si ejecutas ese código antes de que el DOM esté listo, dojo.byId ("inbox_button") devolverá nulo. Por lo que su conexión es en realidad haciendo:

dojo.connect(null, "onclick", function() { ... }) 

.. si la primera arg a dojo.connect es nulo, se utilizará el objeto global o 'ventana'.

Pero, eso es solo un error aquí. Su elemento de botón se está convirtiendo en widget, y se convirtió en un dijit.form.Button. Por lo que debe a conectar con el método onClick del widget aquí, no onclick del nodo:

dojo.connect(dijit.byId("inbox_button"), "onClick", function() { ... }); 

Además, para que quede claro, que nunca debió a dojo.require nada en dojo._base, esa es la promesa de que Dojo. js te hace a ti - está todo incluido.

+0

Gracias, hice ese cambio en todos mis botones. Sin embargo, una pregunta: el uso de dojo.byId ("x") y onclick estaba funcionando, entonces ¿por qué sería preferible usar dijit/onClick? – Daniel

Cuestiones relacionadas