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

时间:2016-01-24 00:42:40

标签: 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."

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

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

  destroyRecord() {...},

  serialize() {...},

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

let newModel = Model.create();
newModel.get('store');

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

2 个答案:

答案 0 :(得分:20)

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

这意味着要使依赖注入工作,您需要通过容器获取Model的新实例。由于getOwner而假设Ember 2.3,并且this位于Ember应用程序中的某个位置:

let owner = Ember.getOwner(this);
let newModel = owner.lookup('object:model');
newmodel.get('store');

您可以参考lookup documentation here

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

$ 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 documentation here

希望这有用!

答案 1 :(得分:0)

您需要在创建模型实例时传入容器实例。可以使用this.get('controller')在路径,控制器和组件中访问容器。 AFAIK基本上用容器创建的任何内容都会获得容器属性集。这就是为什么服务注射在控制器等工作。

因此,如果您要使用路线方法创建模型。代码如下所示

App.IndexRoute = Ember.Route.extend({
  model: function() {
    var newModel = Model.create({
      container: this.get('container')
    });    
    return newModel.get('test').getText();
  }
});

Here is a working demo.