2013-02-13 30 views
9

Tôi đã thấy rất nhiều câu hỏi về điều đó trên web (SOF và Google) nhưng cho đến nay chưa có câu trả lời rõ ràng cho vấn đề này.Làm thế nào để có được một tài liệu tham khảo về một trường hợp xem trong ember/emberjs từ javascript tĩnh?

Tôi có ứng dụng Ember thông thường với các chế độ xem và bộ điều khiển khác nhau. Một trong các khung nhìn của tôi có một phương thức cá thể mà tôi muốn gọi từ một ngữ cảnh tĩnh. Vì vậy, trong một tập tin javascript bình thường. Tôi có nên tham chiếu đến chế độ xem được instagiated bởi ember để gọi phương thức này không?

Một vài dòng mã để minh họa cho vấn đề của tôi:

Trong ApplicationView.js:

App.ApplicationView = Em.View.extend({ 
    templateName: 'application', 

    myInstanceMethod:function() { 
     this.anotherInstanceMethod(some, params); 
    }, 
    // ... more code 
}); 

Trong MyUtils.js:

var myUtils = myUtils || { 
    myMethod: function() { 
     myApplicationViewInstance.myInstanceMethod(); 
    } 
}; 

Trả lời

6

Đây là cá nhân của tôi tiếp cận vấn đề này. Tôi đang sử dụng "didInsertElement" của Ember.View để đăng ký View ở vị trí trung tâm. Điều này hoạt động tốt cho lượt xem đơn. Đối với quan điểm không phải singleton, người ta sẽ phải phát triển một ViewRegistry tinh vi hơn.

Ember Phần

var App = Ember.Application.create({ 
    viewRegistry : { 
     applicationView : null 
    }, 
}); 

App.ApplicationView = Ember.View.extend({ 
    templateName : 'application', 
    didInsertElement : function(){ 
     App.set("viewRegistry.applicationView", this); 
    } 
}); 

Trong MyUtils.js:

var myUtils = myUtils || { 
    myMethod: function() { 
     App.get("viewRegistry.applicationView").myInstanceMethod(); 
    } 
}; 
+0

đẹp bắt. Tôi phát hiện ra rằng như tôi đã đăng ký applicationController của tôi trong router, tôi có thể truy cập ứng dụng của tôi bằng cách làm App.get ('router.applicationView') như bạn làm với registry của bạn! Thx – Sephy

3

Ember đã có một "băm quan điểm toàn cầu"

tìm kiếm ember.js cho Ember.View.views = {}

Nó được lập chỉ mục bởi id yếu tố mỗi lần xem, vì vậy nhận được một cái nhìn dễ dàng như:

myView = Ember.View.views[$('.myViewSelector').attr('id')] 

người thầy của tôi tuy nhiên tin rằng sử dụng phương pháp này là một bẩn hack và khuyên tôi nên tìm một cách tốt hơn. Ông đã viết một helper kiểm tra:

window.lookupView = function(key) { 
    var activeViews = app.__container__.lookup('router:main')._activeViews; 
    if(!activeViews) { throw new Error("No active views."); } 
    if(!activeViews[key]) { throw new Error("No view '%@'.".fmt(key)); } 
    return activeViews[key][0]; 
}; 

mà tôi sử dụng để có được parentView tôi mong muốn và sau đó bất kỳ trẻ em với parentView.get('childViews')

+0

Cảm ơn bạn - đây dường như là phương pháp được đề xuất hiện tại của Ember để tìm kiếm chế độ xem theo id phần tử DOM. Xem http://emberjs.com/guides/understanding-ember/debugging/#toc_get-the-view-object-from-its-dom-element-s-id –