Внедрить службу в объект Ember [не контроллер Ember]
Я пытаюсь ввести службу Ember в объект Ember, но продолжаю получать следующую ошибку:
"Assertion Failed: Attempting to lookup an injected property on an
object without a container, ensure that the object was instantiated
via a container."
мой код выглядит примерно следующим образом:
const Model = Ember.Object.extend({
store: Ember.inject.service(),
destroyRecord() {...},
serialize() {...},
deserialize() {...},
});
let newModel = Model.create();
newModel.get('store');
Примечание: он работает, если я вводил службу в контроллер, но не объект. Не удалось выяснить, как зарегистрировать объект с помощью контейнера Ember.
2 ответов
он работает в Ember.Controller
потому что Ember контролирует жизненный цикл объекта. Короче говоря, когда Ember нужен экземпляр определенного контроллера, он запрашивает контейнер для одного, и контейнер предоставит экземпляр, инициализируя при необходимости.
это означает, что для работы инъекции зависимостей вам нужно будет получить новый экземпляр Model
через контейнер. Предполагая Ember 2.3 из-за getOwner
и this
где-то внутри Уголек применение:
let owner = Ember.getOwner(this);
let newModel = owner.lookup('object:model');
newmodel.get('store');
вы можете обратиться к lookup
документации.
а как зарегистрироваться? Используйте инициализатор приложения:
$ ember generate initializer register-model
затем откройте сгенерированный инициализатор и, предполагая, что ваш файл находится в app/folder/model.js
, поставить что-то вроде:
import Model from 'app-name/folder/model';
export function initialize(application) {
application.register('object:model', Model);
}
export default {
name: 'register-model',
initialize
};
вы можете обратиться к register
документации.
надеюсь, это полезно!
Ну, вам нужно передать экземпляр контейнера при создании экземпляра вашей модели. Контейнер доступен в маршруте, контроллерах, компонентах с this.get('controller')
. AFAIK в основном все, что создано с контейнером, получает набор свойств контейнера. Вот почему сервисные инъекции работают в контроллерах и т. д..
Итак, если вы создаете модель в методе маршрута. Код будет выглядеть следующим образом
App.IndexRoute = Ember.Route.extend({
model: function() {
var newModel = Model.create({
container: this.get('container')
});
return newModel.get('test').getText();
}
});