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();
3条答案
按热度按时间dkqlctbz1#
好的,了解
Ember.inject.service
实际上做了什么很重要!这是一个简短的版本:那么这个e1d1e是什么?它为您提供对象的所有者。模型、控制器、组件、视图等大多数对象都是由依赖注入(DI)容器创建的。要使类在DI容器上可用,需要注册它。
默认类(如控制器、路由、视图)由Resolver自动注册。注册后,当容器创建它们时,您可以将它们自动注入到其他类中。也将所有者注入容器创建的所有示例中。
因为容器本身是私有的,所以这些公共API位于应用程序上。getOwner还返回应用程序。
如果要手动查找容器上的示例,可以使用查找。
对于工具类,您可能使用普通
.create()
来获取对象。当然,这不会自动将其与应用程序耦合,因此所有者不可用。此外,自动喷射也不起作用。您可以使用所有者手动注入所有者注入:
然后
Ember.inject.service
将工作,因为getOwner将返回注入的所有者。您可以做的另一件事是在容器上注册实用程序对象,然后查找它们。然后自动注入所有者。
omtl5h9j2#
不确定是哪个Ember版本启动了此模式,但Ember文档包含从v4.3开始的问题答案:
rsaldnfx3#
不久前,我遇到了一个类似的问题。
这些实用程序的类型为Ember.Object。因此,您所要做的就是将服务注入到Ember中。对象类作为属性。
这样地:
等等,好了!现在,您可以随时随地使用您的服务