2010-06-09 7 views
6

Ich bin in ein Problem laufen dojo.connect() verwendet ein ‚Onclick‘ Ereignis mit diesem Knopf zu verbinden:dojo.connect wird nicht ‚Onclick‘ mit Taste

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

und der Code Herstellung die Verbindung ist:

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;"})) 
}); 

anstatt jedoch die Funktion auszuführen, wenn die Schaltfläche geklickt wird, ANY Onclick-Ereignis löst die Funktion, und ich mit vielen Kindern Behälter enden.

Obwohl ich bin mir ziemlich sicher, dass die .Connect() Funktion als Teil der Dojo Basisfunktionalität zur Verfügung stehen soll, ich habe ‚erforderlich‘ es ausdrücklich:

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

Irgendwelche Ideen, warum diese Macht passiert sein?

Antwort

2

Um meine eigene Frage zu beantworten: unterschätzen Sie nie den Wert von dojo.addOnLoad!

Ich fühle, dass, da die Schaltfläche als Widget verwendet wurde, ihre ID erst nach dem Laden von Dojo registriert wurde, und da der Verbindungscode nicht in einem addOnLoad-Block war, konnte sie die (nicht noch geladen). Der Grund dafür, dass die Methode bei jedem Klick-Ereignis ausgelöst wurde, war die Art und Weise, wie Dojo in der connect() - Funktion mit null-Objekten umgeht: Sie ignoriert sie und verwendet stattdessen dojo.global (Dojos Version von document.window) Objekt.

Ich hoffe, das hilft jedem anderen, der auf ein ähnliches Problem gestoßen sein könnte!

12

Wie Sie sagen, wenn Sie diesen Code ausführen, bevor das DOM bereit ist, gibt dojo.byId ("inbox_button") null zurück. Also Ihr connect tut tatsächlich:

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

.. wenn das erste arg dojo.connect null ist, wird die globale oder ‚Fenster‘ Objekt verwendet werden.

Aber das ist nur ein Fehler hier. Ihr Schaltflächenelement wird mit einem Widget versehen und in eine dijit.form.Button umgewandelt. So sollten Sie auf das Widget-onClick Methode verbinden werden hier nicht des Knotens Onclick:

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

Auch klar zu sein, sollten Sie nie etwas in dojo._base dojo.require haben, das ist das Versprechen, das Dojo. js macht euch - alles ist gebündelt.

+0

Danke, ich habe diese Änderung an allen meinen Tasten vorgenommen. Eine Frage allerdings: Mit dojo.byId ("x") und onclick funktioniert es, warum sollte man also dijit/onClick verwenden? – Daniel