2010-04-01 4 views
6

Ich scheinen nicht in der Lage, das Ereignis onchange korrekt zu einem Dijit.form.Select Widget anfügen. Jedoch bin ich neu in der Webentwicklung, also könnte ich etwas komplett idiotisches tun (obwohl, wie ich es am besten beurteilen kann (und ich habe alle Dokumente gelesen, die ich finden konnte), bin ich nicht). Ich stellte sicher, dass die Body-Klasse dem Dojo-Thema entspricht, dass ich dojo.require() für alle Widgets, die ich verwende (und dojo.parser), und immer noch, nada. Der Code, den ich benutze ist:Ich kann nicht onChange zu feuern für dijit.form.Select

dojo.addOnLoad(function() { 
    var _query = dojo.query('.toggle'); 
    for (var i in _query) { 
     dojo.connect(_query[i], 'onchange', function (ev) { 
      console.log(ev + ' fired onchange'); 
     }); 
    } 
}); 

Jede Hilfe würde geschätzt werden.

Addition: nach dem Graben mehr in die Interna von wie Dijit Widgets darstellt, entdeckte ich, dass, wenn ich das Attribut-Wert-Paar DojoType = 'Dijit.form.Select' zu meinem HTML-Element (dies tut dies deklarativ), Dijit tatsächlich Rendert eine einreihige Zweifarben-Tabelle. Das erste Element der Tabelle ist ein Span (mit der Klasse dijitSelectLabel), von dem ich annahm, dass er nur das ausgewählte (oder Standard) Element anzeigt. Das zweite Element scheint eine Schaltfläche zu sein, die als Abwärtspfeil dargestellt wird und die Anzeige des Menüs als Reaktion auf bestimmte DOM-Ereignisse umschaltet. Auch (und ich dachte, das wäre ziemlich raffiniert), platziert Dijit die Auswahloptionen nicht in der DOM-Struktur, bis eines dieser Ereignisse ausgelöst wird. Ich habe den HTML-Code im Firebug direkt nach einem neuen Pager gelesen (bevor ich irgendetwas angeklickt habe), und die zweite Option ist nirgendwo zu finden. Dann, sobald ich auf die Pfeiltaste klicke, gibt es ein Dijit.Menu Widget, Dijit Sticks ein Dijit.Menu an das Ende des Körpers Knoten; Nachdem ich irgendwo anders geklickt habe, ist das Menü-Widget immer noch das lastChild des Körpers, jetzt ist es nur versteckt und nicht an das Formular angehängt. Widget auswählen.

Sollte es wirklich so kompliziert sein, wenn ich nur ein anderes dijit.form-Widget im DOM-Baum platzieren will, je nachdem, was der Benutzer auswählt?
Fazit: Es stellte sich heraus, es war ein Großschreibung Problem.

dojo.connect(widget_obj, 'onChange', function_obj); 
funktioniert, während

dojo.connect(widget_obj, 'onchange', function_obj); 
nicht funktioniert.

So hatte ich Recht, dass ich völlig dumm war. Ich nahm an, dass, weil die Kleinbuchstaben-Version funktioniert, wenn sie ein html-Tag als Attribut platziert, Dojo dasselbe behandeln würde. Dies ist sinnvoll, da dijit.form.Select kein .onchange-Attribut, aber ein .onChange-Attribut hat. (Ich blieb am Ende mit einem .Select über einen .FilteringSelect, weil ich meine Benutzer nicht den Eindruck haben, dass sie etwas eintippen können.) Also, von wem von euch gebe ich die Antwort (weil Sie beide hatte ich Änderungen in Ihren Posts, ich glaube, ich war einfach zu unerfahren um zu erkennen, dass der Fall wichtig war)?

Antwort

2

Versuchen Sie Folgendes, wenn ein dojo.connect tun:

var inputEvents = []; //Global var 

    inputEvents.push(dojo.connect(dijit.byId(inputFldStr), "onChange", eventFuncObj)); 

Shop die Verbindung in einem globalen var.

+0

Ich versuchte sowohl dijit.byId (nodeId) und dijit.byNode (Knoten) und keiner der Ansätze funktionierte. – yarmiganosca

1

In Ihrem Code verbinden Sie einen Handler mit "onchange" -Ereignis von Dom-Knoten, nicht Dojo-Widgets. dojo.query gibt Ihnen ein NodeList-Objekt zurück - eine Sammlung von Knoten, die der Abfrage entsprechen.
In diesem Fall ist es zuverlässiger, eine Verbindung zum Ereignis "onChange" eines Widgets herzustellen, wie GoinOff gezeigt hat. Nur eine kleine Ergänzung zu seiner Antwort, um sicherzustellen, dass Sie das richtig machen.
Angenommen, dies ist Ihr html (in späteren Versionen von Dojo wurde dijit.form.Select durch dijit.form ersetzt.Filtering):

<input dojoType="dijit.form.FilteringSelect" id="stateInput" store="stateStore" searchAttr="name" name="state"/> 

Dann sind Sie auf ‚onChange‘ diese Weise in Verbindung bringen würde (Sie können auch die Verbindung in einigen Array speichern zu können, um es später zu trennen, wie GoinOff) vorgeschlagen:

dojo.addOnLoad (function() { 
    dojo.connect(dijit.byId("stateInput"), "onChange", function(){}); 
} 

Aber es ist eine andere Geschichte, wenn Sie die ID Ihres Widgets nicht kennen und dojo.query verwenden möchten, um sich mit mehreren Widgets zu verbinden.

+0

Das hat auch nicht funktioniert (vor allem, weil die Optionen außerhalb des Widgets gerendert wurden, bis ich es in