2

假设我声明了一个应用程序命名空间:

App = Ember.Application.create();

后来我编写了一个 arrayController 实例,它创建对象并将其挂钩到用户事件的应用程序命名空间:

App.objController = Ember.ArrayController.create({
    content: [],

    createObj: function(){
        // instantiate new object
        var newObj = Ember.Object.create({ ... })
        //give obj a name
        var newObjName = this._getObjName( someParam );
        // hook object to an app namespace -> this is where I have an issue
        App[newObjName] = newObj
   },

   ...

});

请参阅我明确使用 App[newObjName] = newObj 将对象挂钩到命名空间,理想情况下,我希望以某种通用方式命名应用程序命名空间,以防我稍后将 objController 用于不同的应用程序。

必须有某种方法可以做到这一点,尽管我对 Ember 还不够熟悉,无法遇到它。

注意:从 1 到 JFGI,这个问题绝对不是 1。另一方面,对于任何有时间的人来说,它都是一个免费的已解决复选标记。

4

2 回答 2

1

考虑使用injections,这是添加依赖项的首选方式。

Ember.Application.registerInjection({
  name: 'fooObject',
  before: 'controllers',

  injection: function(app, router, property) {
    if (property === 'FooObject') {
      app.set('fooObject', app[property].create());
    }
  }
});

所以如果你定义一个类如下:

App.FooObject = Ember.Object.extend({ 
  // ...
});

注入将创建一个实例到App.fooObject. 虽然我们仍然使用命名空间App,但是只有一次。你可以进一步做:

Ember.FooObject = Ember.Object.extend({ 
  // ...
});

然后在你的应用程序中,App.FooObject = Ember.FooObject但我不确定它是否有用。

于 2012-10-04T22:44:44.963 回答
1

在初始化阶段,Ember 将实例化所有的控制器,并为每个控制器注入三个属性——“target”、“controllers”、“namespace”。“命名空间”属性是您的应用程序。

也就是说,而不是硬编码顶级对象:

App[newObjName] = newObj

您可以执行以下操作:

this.get("namespace").set(newObjName, newObj);

注意 - 为了使其工作,您的应用程序需要一个router。此外,您应该定义控制器类,而不是实例。Ember 将为您实例化所有控制器。所以这

App.objController = Ember.ArrayController.create({/* code here */});

应该写成

App.ObjController = Ember.ArrayController.extend({/* code here */});

Note the capital "O" in "ObjController".

于 2012-10-12T08:27:34.123 回答