Ember.js 将服务注入到余烬对象[而不是余烬控制器]

Ember.js 将服务注入到余烬对象[而不是余烬控制器],ember.js,Ember.js,我试图将一个余烬服务注入到一个余烬对象中,但一直出现以下错误: "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

我试图将一个余烬服务注入到一个余烬对象中,但一直出现以下错误:

"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容器时,没有遇到任何运气。

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

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

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

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

这意味着要使依赖项注入工作,您需要通过容器获得
Model
的新实例。假设由于
getOwner
而导致了Ember 2.3,并且
位于Ember应用程序内部:

let owner = Ember.getOwner(this);
let newModel = owner.lookup('object:model');
newmodel.get('store');
你可以咨询网站

但是如何注册呢?使用应用程序初始值设定项:

$ 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
};
你可以咨询网站


希望这是有帮助的

因此,为了澄清,注册不属于余烬生命周期的对象(在我的例子中是模型)是使用初始值设定项完成的。要在应用程序的其他位置检索模型类,请调用
Ember.getOwner(this.lookup('object:model')
,是吗?(查找调用显然同时检索模型类并对其调用
.create()
)。在我的例子中,只需通过
import Model from'path/to/Model在所有必要文件的顶部导入同样有效,因为我仍然可以与静态方法交互。简言之,是的。除非您希望Ember管理生命周期,否则您实际上不需要注册它们,因此
import
ing可以像您所说的那样。如果您想更详细地讨论,请在Slack group中ping我!实际上,再看一眼,我意识到只需通过
import Model from
path/to/Model';导入即可通过
Ember.getOwner(this.lookup(…)
从已注册的对象中执行查找时,w/o仍会引发相同的错误。一旦我振作起来,我就会放松下来。