2012-04-30 10 views
18

decir que estoy definiendo vistas anidadas, al igual que (code example on JSFiddle):Ember.js: ¿Cómo acceder a las instancias vista anidada

App.ParentView = Ember.View.extend({ 
    ChildView: Ember.View.extend({ ... }), 
    method: function() { 
     this.get('ChildView') // => this is the class, not the instance :(
    } 
});​ 

{{#view App.ParentView}} 
    {{#view ChildView}} 
     ... 
    {{/view}} 
{{/view}} 

me gustaría evitar la unión de una gran cantidad de atributos entre la vista de los padres y la vista de niño Más bien, me gustaría hacer algo como this.getPath('ChildView.foo'). Pero this.get('ChildView') devuelve la clase que creé con Ember.View.extend, no la instancia, por lo que no puedo acceder a los atributos.

¿Existe alguna manera canónica de acceder a la instancia actual de una vista secundaria desde dentro de un método de la vista principal?

Respuesta

24

puede pasar un punto de vista la variable viewName y acceder a la vista a través de la matriz de esa manera.

Ver http://jsfiddle.net/Tx3NP/5/

{{#view App.ParentView}} 
    {{#view childView viewName="childViewInstance"}} 
    ... 
    {{/view}} 
{{/view}} 
console.log(this.get('childViewInstance.value')); 

o se puede hacer como @weltraumpirat recomienda y acceder a la matriz this.get('childViews').

+0

Me parece que el enlace 'viewName' es lo que los autores de ember.js pretendían que usara,' _childViews' parece IMO privada. Y dar a la vista una identificación no ayuda si tiene varias instancias de la misma. –

+2

Gracias, esto es muy útil. He adoptado una convención de llamar a mis clases 'ChildView' (en mayúscula) y usar' viewName = "childView" '(sin mayúscula) para los nombres de instancia. Esto lo hace razonablemente no confuso. –

+0

@Bradley, en su ejemplo, ¿hay alguna diferencia entre '' 'getPath''' y' '' get''', si '' 'this''' se refiere a la vista padre? –

2

Puede utilizar el _childViews matriz:

console.log(this._childViews[0].get('value')); 

o le puede dar su punto de vista, una identificación y simplemente utilizar jQuery para acceder al elemento HTML correspondiente.

{{#view childView id="childView"}} 

console.log(Em.$('#childView')[0].value); 
+0

Me opongo moralmente a sacar datos de aplicaciones del DOM como en el segundo ejemplo. ;-) Pero es un buen puntero con '_childViews', incluso si es privado. –

+0

¿Hay un equivalente de _childViews que solo devuelve vistas no virtuales? – user1158559

0

En realidad es bastante simple.

A partir de 2.10.0, si estás dentro de un componente y necesita encontrar un componente anidado, sólo tiene que buscar a través de:

const id = 'my-specific-id-im-looking-for', 
    views = this.get('childViews'); 

    let count = views.length; 

    if (count) { 
    while (--count) { 
     if (views[count].get('elementId') === id) { 
     // this is your view. do stuff with it, call methods on it, whatevs; 
     break; 
     } 
    }  
    } 

Si eres antes de esto, trate de usar el método forEachChildView del componente

Cuestiones relacionadas