将服务注入到Ember对象[不是Ember控制器] [英] Inject a service into an Ember Object [not an Ember Controller]

查看:126
本文介绍了将服务注入到Ember对象[不是Ember控制器]的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

 断言失败,我试图将一个Ember服务注入到一个Ember对象中:尝试在没有容器的
对象上查找注入的属性,确保通过容器将对象实例化为

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

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

destroyRecord() 。},

serialize(){...},

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

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

注意:如果我将服务注入到控制器中,但不是一个对象。没有任何运气试图找出如何使用Ember容器注册对象。

解决方案

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



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

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

您可以参考 查找这里的文档



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

  $ ember generate initializer register-model 

然后,打开生成的初始化程序,假设您的文件位于 app / folder / model.js 如下所示:

 从'app-name / folder / model'导入模型; 

导出函数initialize(application){
application.register('object:model',Model);
}

export default {
name:'register-model',
initialize
};

您可以参考 注册这里的文档



希望这是有帮助的! p>

I'm trying to inject an Ember service into an Ember Object but keep getting the following error:

"Assertion Failed: Attempting to lookup an injected property on an
object without a container, ensure that the object was instantiated 
via a container."

My code looks essentially something like the following:

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

  destroyRecord() {...},

  serialize() {...},

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

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

Note: it does work if I inject the service into a Controller, but not an object. Haven't had any luck trying to figure out how to register the Object with the Ember container.

解决方案

It works for an Ember.Controller because Ember controls the lifecycle of the object. In short, when Ember needs an instance of a certain controller, it asks the container for one, and the container will provide the instance, initializing if necessary.

What this implies is that for dependency injection to work, you would need to get a new instance of Model through the container. Assuming Ember 2.3 because of getOwner, and that this is somewhere inside the Ember application:

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

You can consult the lookup documentation here.

But how to register? Use an application initializer:

$ ember generate initializer register-model

Then, open up the generated initializer and, assuming that your file is in app/folder/model.js, put something like:

import Model from 'app-name/folder/model';

export function initialize(application) {
  application.register('object:model', Model);
}

export default {
  name: 'register-model',
  initialize
};

You can consult the register documentation here.

Hope this is helpful!

这篇关于将服务注入到Ember对象[不是Ember控制器]的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆