Ember将注册服务注入Ember Utility

Taz*_*ngo 2 ember.js

我知道Ember有一个记录器,但我想创建自己的记录器用于学习目的.我有一个名为logger的服务,我希望能够在任何地方使用此服务.我没有问题将此服务注入组件,控制器等...我无法弄清楚如何将此服务注入到我创建的实用程序中而不通过create函数传递它.我不想在创建实用程序的任何地方都通过我的记录器.当我试图将它注入对象时,它抱怨不在容器中.最好的方法是什么?

Lux*_*Lux 8

好的,了解Ember.inject.service实际做的很重要!它就像一个较短的版本:

myService: Ember.computed({
  get() {
    return Ember.getOwner(this).lookup('service:myService);
  }
}),
Run Code Online (Sandbox Code Playgroud)

这是什么getOwner?它为您提供了Object的所有者.大多数对象(如模型,控制器,组件,视图等)都是由依赖注入(DI)容器创建的.要在DI容器上提供类,需要注册.

您的默认类(如控制器,路径,视图)将由解析程序自动注册.注册后,您可以在容器创建它们时自动它们注入其他类.此外,在容器创建的所有实例中注入所有者.

由于容器本身是私有的,因此这些公共API位于Application上.getOwner也返回应用程序.

如果要手动查找容器上的实例,可以使用查找.

对于您的实用程序类,您可能使用法线.create()来获取对象.这当然不会自动将其耦合到您的应用程序,因此所有者不可用.自动注射也不起作用.

您可以使用ownerInjection手动注入所有者:

myClass.create(Ember.getOwner(this).ownerInjection(), {...});
Run Code Online (Sandbox Code Playgroud)

然后Ember.inject.service将工作,因为getOwner将返回注入的所有者.

您可以做的另一件事是在容器上注册您的实用程序对象,然后查找它们.然后自动注入所有者.