9

我在网上(SOF 和 Google)上看到了很多关于此的问题,但到目前为止还没有明确的答案。

我有一个带有各种视图和控制器的常用 Ember 应用程序。我的一个观点有一个我想从静态上下文中调用的实例方法。因此在一个普通的javascript文件中。我应该获得对 ember 实例化的视图的引用以调用该方法吗?

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

在 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();
    }
};
4

2 回答 2

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();
    }
};
于 2013-02-13T12:53:14.477 回答
3

Ember 已经有一个“全局视图哈希”

搜索ember.js_Ember.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')

于 2014-01-15T00:42:30.390 回答