2012-04-30 30 views
18

Nói rằng tôi đang xác định xem lồng nhau, như vậy (code example on JSFiddle):Ember.js: Làm thế nào để truy cập vào các trường hợp xem lồng nhau

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

Tôi muốn tránh ràng buộc rất nhiều thuộc tính giữa các điểm phụ huynh và chế độ xem con. Thay vào đó, tôi muốn làm một cái gì đó như this.getPath('ChildView.foo'). Nhưng this.get('ChildView') trả về lớp mà tôi đã tạo với Ember.View.extend, không phải là cá thể, vì vậy tôi không thể truy cập các thuộc tính.

Có cách nào hợp lý để truy cập phiên bản hiện tại của chế độ xem con từ bên trong phương thức của chế độ xem gốc không?

Trả lời

24

Bạn có thể chuyển chế độ xem theo số viewName và truy cập chế độ xem qua cha mẹ theo cách đó.

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

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

Hoặc bạn có thể làm như @weltraumpirat khuyến cáo và truy cập vào mảng this.get('childViews').

+0

Dường như với tôi ràng buộc 'viewName' là những gì tác giả ember.js dành cho bạn để sử dụng,' _childViews' trông IMO riêng tư. Và đưa ra một cái nhìn một id không giúp đỡ nếu bạn có nhiều trường hợp của nó. –

+2

Cảm ơn, điều này rất hữu ích. Tôi đã thông qua một quy ước gọi các lớp của tôi 'ChildView' (viết hoa) và sử dụng' viewName = "childView" '(không được viết hoa) cho các tên cá thể. Điều này làm cho nó không hợp lý. –

+0

@Bradley, trong ví dụ của bạn, có sự khác biệt giữa '' 'getPath''' và' '' get''', nếu '' 'this''' đề cập đến chế độ xem gốc không? –

2

Bạn có thể sử dụng _childViews mảng:

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

hoặc bạn có thể cho bạn xem một id và chỉ cần sử dụng jQuery để truy cập vào phần tử HTML tương ứng.

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

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

Tôi phản đối về mặt đạo đức để kéo dữ liệu ứng dụng ra khỏi DOM như trong ví dụ thứ hai của bạn. ;-) Nhưng con trỏ tốt với '_childViews', ngay cả khi nó là riêng tư. –

+0

Có tương đương với _childViews chỉ trả về các chế độ xem không phải ảo không? – user1158559

0

Nó thực sự khá đơn giản.

Tính đến 2.10.0, nếu bạn đang ở trong một thành phần và cần phải tìm một thành phần lồng nhau, chỉ đơn giản là tìm kiếm thông qua:

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

Nếu bạn trước đó, hãy thử sử dụng phương pháp của thành phần forEachChildView

Các vấn đề liên quan