2012-04-30 19 views
18

Öyle gibi iç içe geçmiş görüşlerini tanımlayan ediyorum (code example on JSFiddle) De ki: İsterdim ember.js: İç içe bakış örneklerini nasıl erişilir

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

ebeveyn görünümü ve arasındaki niteliklerin bir çok bağlama önlemek için çocuk bakışı. Bunun yerine, this.getPath('ChildView.foo') gibi bir şey yapmak isterim. Ancak this.get('ChildView'), örneği değil, Ember.View.extend ile oluşturduğum sınıfı döndürür, böylece özniteliklere erişemiyorum.

Çocuk görünümündeki geçerli örneğe, üst görünümdeki bir yöntem içinden erişmenin kanonik bir yolu var mı?

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

veya Eğer görüntülemek bir kimliği verebilir ve sadece gelen HTML elemanı erişmek için jQuery kullanın:

cevap

24

Bir görünüm viewName değişken geçmek ve bu şekilde ebeveyn yoluyla görünümüne erişebilirsiniz.

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

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

Bkz Yoksa @weltraumpirat önerir gibi yapın ve this.get('childViews') dizi erişebilir.

+0

Bana göre 'viewName' bağlaması, ember.js yazarlarının sizin için tasarladığı şeydir, '_childViews' özel IMO'yu arar. Birden fazla örneğiniz varsa, görünümün kimliğine yardımcı olmaz. –

+2

Teşekkürler, bu çok yararlı. Sınıflarımın “ChildView” (büyük harfli) ve örnek isimleri için 'viewName =" childView "(büyük harfsiz) kullanarak bir sözleşme kabul ettim. Bu makul olmayan kafa karıştırıcı yapar. –

+0

@Bradley, örneğinizde, '' '' '' '' 'getPath''' ve '' '' '' '' '' '' '' '' '' '' '' 'ana görünümle ilgili bir fark var mıdır? –

2

Sen _childViews dizi kullanabilirsiniz.

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

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

İkinci örnekte olduğu gibi DOM'dan uygulama verilerini çekmeye ahlaki olarak karşıyım. ;-) Ama özel olsa bile, _childViews' ile iyi bir işaretçi. –

+0

Sanal olmayan görünümleri yalnızca döndüren _childViews eşdeğeri var mı? – user1158559

0

Aslında oldukça basit. Eğer bir bileşen içindeler ve iç içe bir bileşeni bulmak gerekiyorsa 2.10.0 itibariyle

, basitçe arama: Bu öncesinde iseniz

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

, bileşenin yöntemi forEachChildView kullanmayı deneyin