2012-09-18 25 views
9

¿Cuál es la diferencia entre un identificador y un dojo-id de datos en una etiqueta dojo como este:Diferencia entre ID y datos-dojo-id

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

Trato de hacer referencia a este botón para cambiar su label with: var myButton = dijit.byId ("guardar"); para que pueda cambiar la etiqueta del botón myButton.set ("label", "Add New");

Si uso id = "guardar", funciona. Si solo uso data-dojo-id = "save", no funciona.

Soy bastante nuevo en Dojo, así que una explicación o un tutorial al que me pueda dirigir sería muy apreciado.

Respuesta

12

data-dojo-id asigna control dentro de espacio de nombres global, es decir, en window objeto:

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

para que pueda acceder el botón directamente:

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

ver la diferencia en la acción en jsFiddle: http://jsfiddle.net/phusick/7yV56/

EDITAR: Para responder a sus preguntas. Yo no uso data-dojo-id en absoluto. Contamina el espacio de nombres global que es el opuesto directo de lo que hace el AMD. De todos modos, todavía se puede usar algo como widgets.save y widgets.rename para reducir al mínimo la contaminación:

<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>​ 

OMI, data-dojo-id hay para progressive enhancement, no para aplicaciones de pleno derecho.

data-dojo-id simplemente asigna una instancia a una variable, por lo que con múltiples dijits con la misma data-dojo-id la variable apuntará a la última asignada (es decir, no será una matriz).

Puede evitar el uso extenso de registry.byId escribiendo su método para obtener widgets de acuerdo a sus necesidades. La mejor manera de comenzar es dijit/registy.findWidgets(rootNode, skipNode). Tenga en cuenta también, que dojo/parser.parse(rootNode, options) devuelve una matriz de objetos instanciados, o más precisamente:

Devuelve un objeto fusionado que es una matriz de los objetos instanciados, pero también puede incluir una promesa que se resuelve con la instancia objetos. Esto se hace por compatibilidad con versiones anteriores. Si el analizador requiere automáticamente módulos, siempre se comportará de manera promisoria y se deberá usar parser.parse().then(function(instances){...}).

Un ejemplo de un método que utilizo para asignar dijits de contentPane en su widgets propiedad, que es un objeto:

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

puse toda la clase aquí: https://gist.github.com/3754324. Yo uso este app.ui._Pane en lugar de dijit/layout/ContentPane.

+0

Gracias Phusick! Usar solo el atributo id requiere el uso del método byId para obtener el enlace DOM.Ahora me pregunto cuál es mejor para usar en un módulo de Dojo donde está creando instancias múltiples. ¿Data-dojo-id se encarga de gestionarlo internamente para que una identidad de instancia no se confunda con otra? – teaman

Cuestiones relacionadas