Внедрение зависимостей в модель 'ember-model' и использование флага MODEL_FACTORY_INJECTIONS
Ранее я задавал подобный вопрос здесь. Внедрение зависимостей в модель Ember, но теперь я считаю, что моя проблема на самом деле связана с внедрением зависимостей в модель '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>
Спасибо за любую помощь!
1 ответ
Ember Model просто делает ClassType.create()
для создания экземпляров он не использует контейнер для создания экземпляров. Это означает, что нет DI с Ember Model. Вы можете присоединить контейнер к базовой модели Ember, получить от него все наследство вашей модели, а затем присоединить к нему appConfig.
MODEL_FACTORY_INJECTIONS применяется к Ember Data.
Как правило, я бы не рекомендовал бить по сырому контейнеру, но люди делают то, что хотят, поэтому вот как это можно сделать.
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()
});