在Ember.js中,如何将对象挂钩到通用应用程序命名空间中

时间:2012-10-04 16:06:51

标签: javascript web-applications ember.js

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

App = Ember.Application.create();

稍后我编写了一个arrayController实例,该实例创建对象并将其挂钩到用户事件上的app命名空间:

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.另一方面,对于任何有片刻的人来说,这是一个免费的解决方案。

2 个答案:

答案 0 :(得分: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,但我不确定它是否有用。

答案 1 :(得分:1)

在初始化阶段,Ember将实例化所有控制器,并为每个控制器注入三个属性 - “target”,“controllers”,“namespace”。 “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 */});

注意“ObjController”中的大写“O”。