2012-04-30 2 views
18

sagt, dass ich verschachtelte Ansichten bin definieren, wie so (code example on JSFiddle):Ember.js: Wie verschachtelte Ansicht Instanzen zugreifen

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

Ich mag würde eine Menge von Attributen zwischen der übergeordneten Ansicht vermeiden Bindung und die Kinderansicht. Ich würde eher etwas wie this.getPath('ChildView.foo') machen. Aber this.get('ChildView') gibt die Klasse zurück, die ich mit Ember.View.Viewtend erstellt habe, nicht die Instanz, also kann ich nicht auf die Attribute zugreifen.

Gibt es eine kanonische Methode, um von einer Methode der übergeordneten Ansicht auf die aktuelle Instanz einer untergeordneten Ansicht zuzugreifen?

Antwort

24

Sie können eine Ansicht, die viewName Variable übergeben und die Sicht durch die Eltern zugreifen, die Art und Weise.

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

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

Oder Sie tun können, als @weltraumpirat die this.get('childViews') Array empfiehlt und zuzugreifen.

+0

Scheint mir, die 'viewName' Bindung ist was die ember.js Autoren für Sie verwenden wollten,' _childViews' sieht private IMO. Und die Angabe einer ID hilft nicht, wenn Sie mehrere Instanzen davon haben. –

+2

Danke, das ist sehr nützlich. Ich habe eine Konvention angenommen, die meine Klassen 'ChildView' (großgeschrieben) aufruft und' viewName = "childView" '(nicht großgeschrieben) für die Instanznamen verwendet. Dies macht es einigermaßen nicht verwirrend. –

+0

@Bradley, in Ihrem Beispiel gibt es einen Unterschied zwischen '' 'getPath''' und' '' get''', wenn '' 'this''' sich auf die Elternansicht bezieht? –

2

können Sie die _childViews Array verwenden:

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

oder Sie die Ansicht eine ID geben können und einfach jQuery verwenden, um das entsprechende HTML-Element zuzugreifen.

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

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

Ich bin moralisch dagegen, Anwendungsdaten aus dem DOM wie in Ihrem zweiten Beispiel zu ziehen. ;-) Aber guter Zeiger mit '_childViews', auch wenn es privat ist. –

+0

Gibt es ein Äquivalent von _childViews, das nur nicht-virtuelle Ansichten zurückgibt? – user1158559

0

Es ist eigentlich ganz einfach.

Ab 2.10.0, wenn Sie in einer Komponente sind und benötigen eine verschachtelte Komponente zu finden, einfach durchsuchen:

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

Wenn Sie diese vor, versuchen Sie die Methode der Komponente forEachChildView