我试图将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。
答案 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();
}
});