繁体   English   中英

Ember 将服务注入 Ember 实用程序

[英]Ember Inject Service into Ember Utility

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

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

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

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

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

因为容器本身是私有的,所以这些公共API位于应用程序上。 getOwner还返回应用程序。

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

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

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

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

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

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

不确定哪个 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();

不久前,我遇到了类似的问题。

这些实用程序的类型为Ember.Object。 因此,您要做的就是将服务作为属性注入Ember.Object类。

像这样:

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

现在,您可以在任何地方使用您的服务

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM