Внедрить службу в объект 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();
  }
});

вот рабочий демонстрация.