假设我声明了一个应用程序命名空间:
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.另一方面,对于任何有片刻的人来说,这是一个免费的解决方案。
答案 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”。