2012-09-18 8 views
9

Was ist der Unterschied zwischen einer ID und einem Daten-Dojo-ID in einem Dojo-Tag wie folgt aus:Unterschied zwischen ID und Daten-Dojo-id

<button id="save" data-dojo-type="dijit/form/Button" type="button" data-dojo-attach-event="onClick:save">Save</button> 

Ich versuche, auf diese Schaltfläche zu verweisen, es ist zu ändern beschriften mit: var myButton = dijit.byId ("speichern"); , damit ich die Tastenbeschriftung ändern kann myButton.set ("label", "Add New");

Wenn ich ID = "Speichern" verwenden, funktioniert es. Wenn ich nur data-dojo-id = "save" verwende, funktioniert es nicht.

Ich bin ziemlich neu in Dojo so eine Erklärung oder Anleitung, auf die Sie mich verweisen können, wäre sehr zu schätzen!

Antwort

12

data-dojo-id ordnet Widget in globalen Namensraum, dh in window Objekt:

<button data-dojo-id="save" data-dojo-type="dijit/form/Button">Save</button>​ 

, so dass Sie die Taste direkt zugreifen können:

save.set("label", "Add New"); 

Sehen Sie den Unterschied in Aktion bei jsFiddle: http://jsfiddle.net/phusick/7yV56/

EDIT: Um Ihre Fragen zu beantworten. Ich verwende data-dojo-id überhaupt nicht. Es verschmutzt den globalen Namensraum, was das direkte Gegenteil von dem ist, was die AMD tut. Wie auch immer, man kann immer noch so etwas wie widgets.save und widgets.rename verwenden, um die Verschmutzung zu minimieren:

<button data-dojo-id="widgets.save" data-dojo-type="dijit/form/Button">Save</button>​ 
<button data-dojo-id="widgets.rename" data-dojo-type="dijit/form/Button">Rename</button>​ 

IMO, data-dojo-id ist es für progressive enhancement, nicht für vollwertige Anwendungen.

data-dojo-id weist nur eine Instanz einer Variablen zu, so dass bei mehreren Dijits mit derselben data-dojo-id die Variable auf die zuletzt zugewiesene zeigt (d. H. Es wird kein Array sein).

Sie können die ausführliche Verwendung von registry.byId vermeiden, indem Sie Ihre Methode schreiben, um Widgets entsprechend Ihren Anforderungen zu erhalten. Der beste Weg zum Starten ist dijit/registy.findWidgets(rootNode, skipNode). Bitte beachten Sie auch, dass dojo/parser.parse(rootNode, options) eine Reihe von instanziiert Objekte zurückgibt, oder genauer gesagt:

Liefert ein gemischtes Objekt, das ein Array der instanziiert Objekte ist, sondern auch ein Versprechen enthalten, die mit dem instanziiert behoben Objekte. Dies geschieht aus Gründen der Abwärtskompatibilität. Wenn der Parser Module automatisch anfordert, verhält er sich immer versprechend und parser.parse().then(function(instances){...}) sollte verwendet werden.

Ein Beispiel für eine Methode, die ich ContentPane den Dijits in seine widgets Eigenschaft zuweisen verwenden, die ein Objekt ist:

_attachTemplateWidgets: function(widgets) { 
    widgets = widgets || this.getChildren(); 
    for(var each = 0; each < widgets.length; each++) { 
     var widget = widgets[each]; 
     var attachPoint = widget.params.dojoAttachPoint; 
     if(attachPoint) { 
      this.widget[attachPoint] = widget; 
     } 

     var children = widget.getChildren(); 
     if(children.length > 0) { 
      this._attachTemplateWidgets(children); 
     } 
    } 
} 

ich die ganze Klasse hier setzen: https://gist.github.com/3754324. Ich benutze diese app.ui._Pane anstelle von dijit/layout/ContentPane.

+0

Danke Phusick! Wenn Sie nur das Attribut id verwenden, müssen Sie die Methode byId verwenden, um den DOM-Hook zu erhalten.Jetzt frage ich mich, welche besser für die Verwendung in einem Dojo-Modul ist, in dem Sie mehrere Instanzen erstellen. Arbeitet data-dojo-id intern damit, dass eine Instanzidentität nicht mit einer anderen verwechselt wird? – teaman

Verwandte Themen