2013-02-13 43 views
9

我在网上看到很多关于这个问题的问题(SOF和Google),但到目前为止还没有明确的答案。如何从静态JavaScript获取对ember/emberjs中的视图实例的引用?

我有一个通常的Ember应用程序与各种视图和控制器。我的一个观点有一个我想从静态上下文中调用的实例方法。因此在一个正常的JavaScript文件中。我应该得到一个对由呃立即调用该方法的视图的引用?

的几行代码来说明我的问题:

在ApplicationView.js:

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

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

在MyUtils.js:

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

回答

6

这是我个人解决这个问题。我正在使用Ember.View的“didInsertElement”在一个中心位置注册视图。这适用于单身人士意见。对于非单体视图,人们必须开发更复杂的ViewRegistry。

灰烬部分

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

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

在MyUtils.js:

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

尼斯赶上孩子。我发现,因为我已经在路由器中注册了我的applicationController,所以我可以像使用注册表一样执行App.get('router.applicationView')来访问我的applicationView! Thx – Sephy 2013-02-13 17:27:12

3

灰烬已经拥有了 “全球意见哈希”

搜索ember.jsEmber.View.views = {}

它是由每一个观点元素ID索引,所以得到一个观点是一样容易:

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

我的导师但认为使用这种方法是一个肮脏的黑客,并劝我找一个更好的办法。他写了一个测试助手:

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

我用它让我的期望parentView,然后用parentView.get('childViews')

+0

谢谢 - 这似乎是Ember目前推荐的方法,可通过DOM元素ID查找视图。请参阅http://emberjs.com/guides/understanding-ember/debugging/#toc_get-the-view-object-from-its-dom-element-s-id – 2014-06-22 22:36:38

相关问题