2012-05-06 23 views
19

Una etiqueta Uso de Ember.js ids campo de texto para una etiqueta

<label for="id_of_text_field"> 
<input type="text" name="example" id="id_of_text_field" /> 

Cuando la etiqueta for de la etiqueta y la etiqueta id del campo de texto necesario para que coincida. Tenía dos ideas para hacer este trabajo en mi plantilla Ember.js:

Idea # 1: Traté de hacer una unión especial nombrado field_id utilizar tanto en el label y la TextField. Ejecuté la siguiente manera:

<label {{bindAttr for="content.field_id"}}> {{content.label}}</label> 
{{view Ember.TextField valueBinding="content.data" id="content.field_id"}} 

Por desgracia sólo el label's Identificación procesa de forma correcta. La identificación TextField's hace no se procesa correctamente y resulta ser "metemorph ... something-or-other".

Idea # 2: Para conjurar de alguna manera el ID de TextField y usarlo para la etiqueta, me temo que en algún momento el ID de TextField no estará listo cuando se represente la etiqueta. Incluso si esto no fuera un problema, no sé cómo encontrar la identificación TextField's de JS.

Esto está en una plantilla, así que tendré más de una de estas etiquetas/pares de campos de texto.

¿Cómo puedo obtener la etiqueta for para que coincida con la etiqueta id de TextField con Ember.js?

¡Gracias!

ACTUALIZACIÓN

Consejo de utilización de Peter Wagenet y ligera modificación, hice lo siguiente:

<label {{bindAttr for="textField.elementId"}}> {{content.label}}</label> 
{{view Ember.TextField valueBinding="content.value" viewName="textField"}} 

Usando esta técnica los usuarios ahora pueden hacer clic para seleccionar las etiquetas de campos de texto, casillas de verificación, y selecciona.

+1

Para la última Ember (1.4.0-beta.6) necesita usar 'for =" view.textField.elementId "' en su lugar. – jevon

Respuesta

21

En primer lugar, la etiqueta Metamorph es para el valor de la etiqueta. No está relacionado con la identificación del campo. Sin embargo, este código aún no funcionará porque las propiedades estándar no hacen nada especial con las rutas de propiedad. En este caso, el valor de id, es literalmente content.field_id. Esto ciertamente no es lo que querías. En circunstancias normales, puede usar elementIdBinding (id es solo un alias para elementId), sin embargo, los identificadores de elemento para Vistas de color ámbar no se pueden cambiar después de la creación, por lo que ese enfoque no funcionará aquí.

Una posible solución hace uso de la propiedad viewName. La propiedad viewName proporciona una referencia con nombre a la vista en el parentView.A continuación, puede, hacer lo siguiente:

<label {{bindAttr for="view.textField.field_id"}}> {{content.label}}</label> 
{{view Ember.TextField valueBinding="content.data" viewName="textField"}} 
+1

Creo que http://jsfiddle.net/GtsKK/2/ es una demostración completa de lo que está pasando shs. Desea vincular "for" a textField.elementId, no field_id, ya que la vista TextField no tendrá ese atributo. Además, no puedes usar la clase TextField por sí solo ya que su atributo de nombre no enlaza nada, y para que sea un formulario válido, debes proporcionar un nombre para cada una de tus entradas, así que subclasé TextField y agregó el enlace de atributo de nombre faltante. –

+0

Perdón por las ediciones ... así que establecí la plantilla en: {{view Ember.TextField valueBinding = "content.data "viewName =" textField "}} y eso es todo. Las etiquetas ** for ** y ** id ** se están emparejando. No se requiere JS. ¡Muy agradable! Cambié tu 'field_id' a 'elementId'. Parece muy fácil. – shs

+0

Solo por curiosidad, ¿cómo puedo obtener 'parentView' desde dentro del valor computado de content.field_id? Desde dentro de field_id: function() {} Probé una variedad de get | getPath() con 'view', 'this.view', 'parentView', 'this.parentView', y todos regresaron nulos o indefinidos. – shs

1

Aquí fue mi solución a este problema desde hace un tiempo:

App.Widget.TextField = Em.ContainerView.extend({ 
    tagName: '', 
    type: 'text', 
    label: null, 
    value: null, 
    valueSize: '30px', 

    childViews: ['labelView', 'inputView'], 

    labelView: Em.View.extend({ 
     tagName: 'label', 
     attributeBindings: ['for'], 

     forBinding: 'parentView.inputView.elementId', 

     init: function() { 
      this.set('defaultTemplate', Em.Handlebars.compile(this.getPath('parentView.label'))); 
      this._super(); 
     } 
    }), 

    inputView: Em.TextField.extend({ 
     typeBinding: 'parentView.type', 
     sizeBinding: 'parentView.valueSize', 
     valueBinding: 'parentView.value' 
    }) 
}); 

A continuación, desde el interior de una plantilla Manillar:

{{view App.Widget.TextField label="Some Label"}} 
5

Este won 't siempre resuelve su problema, pero solo quería agregar que simplemente anidar la entrada dentro de la etiqueta es a menudo una solución conveniente, ya que le permite soltar el atributo for (reference).

+0

Interesante. Estaba planeando colocar controles en una mesa con etiquetas en una columna y controles en la otra. – shs

+0

¿Sabes qué soporte tiene el navegador para esto? Con una prueba rápida, parece funcionar bien en Firefox y Chrome. No tengo IE a mano ... –

+0

No lo sé. Sin embargo, parece ser un patrón común, así que supongo que es ampliamente compatible. –

Cuestiones relacionadas