好的,了解什么很重要Ember.inject.service
实际上does!它就像一个较短的版本:
myService: Ember.computed({
get() {
return Ember.getOwner(this).lookup('service:myService);
}
}),
那么这是什么getOwner
?它为您提供了对象的所有者。大多数对象(例如模型、控制器、组件、视图等)都是由依赖注入 (DI) 容器创建的。要使类在 DI 容器上可用,它需要是挂号的 http://emberjs.com/api/classes/Ember.Application.html#method_register.
您的默认类(如控制器、路由、视图)由解析器自动注册。注册后您可以inject http://emberjs.com/api/classes/Ember.Application.html#method_inject当容器创建它们时,它们会自动添加到其他类中。所有者也被注入到容器创建的所有实例中。
因为容器本身是私有的,所以这些公共API都在Application上。 getOwner 还返回该应用程序。
如果您想手动查找容器上的实例,您可以使用lookup http://emberjs.com/api/classes/ContainerProxyMixin.html#method_lookup.
对于您的实用程序类,您可能使用普通的.create()
来获取对象。这当然不会自动将其耦合到您的应用程序,因此所有者不可用。自动注入也不起作用。
您可以手动向所有者注入所有者注入 http://emberjs.com/api/classes/ContainerProxyMixin.html#method_ownerInjection:
myClass.create(Ember.getOwner(this).ownerInjection(), {...});
Then Ember.inject.service
会起作用,因为 getOwner 将返回注入的所有者。
您可以做的另一件事是在容器上注册实用程序对象,然后查找它们。然后所有者被自动注入。