我之前在Injecting dependencies into an Ember model提出了类似的问题,但我现在相信我的问题实际上是将依赖注入'ember-model'模型。
即使我设置了Ember.MODEL_FACTORY_INJECTIONS = true
,我似乎无法将deps注入使用Ember.Model
构建的模型中。
我创建了一个jsbin http://emberjs.jsbin.com/yizoyozu/4/edit?html,js,console,output,它演示了路由,视图和控制器的注入工作,但不适用于模型。
代码类似于:
Ember.MODEL_FACTORY_INJECTIONS = true;
App = Ember.Application.create();
App.initializer({
name: 'config',
initialize: function(container) {
App.deferReadiness();
container.register('app:config', {foo: 'bar', baz: 'boom'}, {instantiate: false});
container.injection('model', 'appConfig', 'app:config');
container.injection('controller', 'appConfig', 'app:config');
container.injection('route', 'appConfig', 'app:config');
container.injection('view', 'appConfig', 'app:config');
App.advanceReadiness();
}
});
App.Router.map(function() {
// put your routes here
});
App.Colors = Ember.Model.extend({
color: Ember.attr(),
init: function() {
this._super();
console.log('inside aModel', this.appConfig); // does this not work?
}
});
App.Colors.load([
{id: 1, color: 'red'}
]);
App.IndexRoute = Ember.Route.extend({
model: function() {
console.log('inside aRoute', this.appConfig);
return App.Colors.find(1);
}
});
App.IndexController = Ember.Controller.extend({
init: function() {
this._super();
console.log('inside aController', this.appConfig);
}
});
使用以下模板
<script type="text/x-handlebars">
<h2> Welcome to Ember.js</h2>
{{outlet}}
</script>
<script type="text/x-handlebars" data-template-name="index">
<ul>
<li>model.color = {{model.color}}</li>
<li>model.appConfig = {{model.appConfig}}</li> <!-- I won't print model.appConfig -->
<li>view.appConfig.foo = {{appConfig.foo}}</li>
</ul>
</script>
感谢您的帮助!
答案 0 :(得分:1)
Ember Model只需要ClassType.create()
来创建实例,它不会使用容器来实例化实例。这意味着,没有与Ember模型的DI。您可以将容器附加到基础Ember模型,让所有模型继承它,然后将appConfig附加到它。
MODEL_FACTORY_INJECTIONS适用于Ember数据。
一般情况下,我建议不要推荐像生产容器一样打人,但是人们会做他们想做的事情,所以这里可以做到这一点。
App.BaseModel = Ember.Model.extend({
appConfig: function(){
return App.__container__.lookup('app:config');
}.property()
});
App.Cow = App.BaseModel.extend({
id: Ember.attr(),
name: Ember.attr()
});