Ember将服务注入Ember实用程序

pdsfdshx  于 2022-09-28  发布在  其他
关注(0)|答案(3)|浏览(164)

我知道Ember有一个日志记录程序,但我想创建自己的日志记录程序以供学习。我有一个名为logger的服务,我希望能够在任何地方使用此服务。我可以将此服务注入到组件、控制器等中……我不知道如何将此服务插入到我创建的实用程序中,而不通过create函数传递它。我不想在创建实用程序的任何地方都必须传递我的日志。当我尝试将其注入对象时,它会抱怨没有在容器中。最好的方法是什么?

dkqlctbz

dkqlctbz1#

好的,了解Ember.inject.service实际上做了什么很重要!这是一个简短的版本:

myService: Ember.computed({
  get() {
    return Ember.getOwner(this).lookup('service:myService);
  }
}),

那么这个e1d1e是什么?它为您提供对象的所有者。模型、控制器、组件、视图等大多数对象都是由依赖注入(DI)容器创建的。要使类在DI容器上可用,需要注册它。
默认类(如控制器、路由、视图)由Resolver自动注册。注册后,当容器创建它们时,您可以将它们自动注入到其他类中。也将所有者注入容器创建的所有示例中。
因为容器本身是私有的,所以这些公共API位于应用程序上。getOwner还返回应用程序。
如果要手动查找容器上的示例,可以使用查找。
对于工具类,您可能使用普通.create()来获取对象。当然,这不会自动将其与应用程序耦合,因此所有者不可用。此外,自动喷射也不起作用。
您可以使用所有者手动注入所有者注入:

myClass.create(Ember.getOwner(this).ownerInjection(), {...});

然后Ember.inject.service将工作,因为getOwner将返回注入的所有者。
您可以做的另一件事是在容器上注册实用程序对象,然后查找它们。然后自动注入所有者。

omtl5h9j

omtl5h9j2#

不确定是哪个Ember版本启动了此模式,但Ember文档包含从v4.3开始的问题答案:

import { inject as service } from '@ember/service';
import { getOwner, setOwner } from '@ember/application';

class Item {
  @service('shopping-cart') cart;

  constructor(context) {
    setOwner(this, getOwner(context));
  }

  function addToCart() {
    this.cart.add(this);
  }
}

// On any framework object...
let item = new Item(this);
item.addToCart();
rsaldnfx

rsaldnfx3#

不久前,我遇到了一个类似的问题。
这些实用程序的类型为Ember.Object。因此,您所要做的就是将服务注入到Ember中。对象类作为属性。
这样地:

Ember.Object.reopen({
  testService:Ember.inject.service('testService')
});

等等,好了!现在,您可以随时随地使用您的服务

相关问题