将服务注入Ember对象[不是Ember控制器]

Jam*_*ing 12 ember.js

我正在尝试将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."
Run Code Online (Sandbox Code Playgroud)

我的代码基本上类似于以下内容:

const Model = Ember.Object.extend({
  store: Ember.inject.service(),

  destroyRecord() {...},

  serialize() {...},

  deserialize() {...},
});

let newModel = Model.create();
newModel.get('store');
Run Code Online (Sandbox Code Playgroud)

注意:如果我将服务注入Controller而不是对象,它确实有效.没有任何运气试图找出如何使用Ember容器注册Object.

loc*_*cks 20

它适用于Ember.Controller因为Ember控制对象的生命周期.简而言之,当Ember需要某个控制器的实例时,它会向容器请求一个,容器将提供实例,必要时进行初始化.

这意味着要使依赖注入工作,您需要Model通过容器获取新的实例.假设Ember 2.3因为getOwner,而且它this在Ember应用程序中的某个地方:

let owner = Ember.getOwner(this);
let newModel = owner.lookup('object:model');
newmodel.get('store');
Run Code Online (Sandbox Code Playgroud)

您可以在lookup此处查阅文档.

但如何注册?使用应用程序初始化程序:

$ ember generate initializer register-model
Run Code Online (Sandbox Code Playgroud)

然后,打开生成的初始化程序,并假设您的文件位于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
};
Run Code Online (Sandbox Code Playgroud)

您可以在register此处查阅文档.

希望这有用!