Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ember.js Ember将服务注入到Ember实用程序中_Ember.js - Fatal编程技术网

Ember.js Ember将服务注入到Ember实用程序中

Ember.js Ember将服务注入到Ember实用程序中,ember.js,Ember.js,我知道Ember有一个记录器,但我想创建自己的记录器用于学习。我有一个名为logger的服务,我希望能够在任何地方使用该服务。我可以将此服务注入组件、控制器等。。。如果不通过create函数将该服务传递给我创建的实用程序,我就无法理解如何将该服务注入到该实用程序中。我不想在我创建实用程序的任何地方都传递我的日志。当我尝试将它注入对象时,它会抱怨没有在容器中。最好的方法是什么?不久前我遇到了类似的问题 这些实用程序的类型为Ember.Object。 因此,您所要做的就是将服务作为属性注入Ember

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

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

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

像这样:

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

瞧!现在您可以在任何地方使用您的服务了

好的,了解
Ember.inject.service
的实际功能非常重要!这就像是一个简短的版本:

myService: Ember.computed({
  get() {
    return Ember.getOwner(this).lookup('service:myService);
  }
}),
那么这是什么
getOwner
?它为您提供对象的所有者。大多数对象(如模型、控制器、组件、视图等)都是由依赖项注入(DI)容器创建的。对于DI容器上可用的类,它需要是

默认类(如控制器、路由、视图)由解析器自动注册。注册后,您可以在容器创建其他类时自动将它们添加到其他类中。所有者也被注入到容器创建的所有实例中

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

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

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

您可以手动向所有者注入以下内容:

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


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

您是否谈论静态导入的函数?不,我有一组实用程序,每个都是Ember.Objects。我希望他们能够访问我创建的记录器服务。我无法对实用程序执行Ember.inject.service()。如何创建它们?如果使用简单的
.create()
创建它们,它们不知道应用程序,因此无法访问公共记录器服务器。但是,如果静态导入记录器,这将起作用。或者使用DI容器创建您的实用程序,或者注入所有者并使用
getOwner
查找服务。DI容器是什么,我如何注入所有者?您能解释一下您的意思吗,或者提供一个代码示例吗?如果对象没有注入所有者,这将不起作用。嗯,我只是不喜欢这样创建一种耦合,只是为了能够访问服务。每次创建实用程序时,我都必须找到所有者。这被认为是错误的余烬实践吗?也是一个输入错误:
myClass.create(ember.getOwner(this.owner.ownerInjection(),{…})
应该是
myClass.create(Ember.getOwner(this.ownerInjection(),{…})嗯,您需要耦合才能访问服务器。最好不要使用create,而是通过查找DI容器来创建对象。或者您不使用服务进行日志记录,而是使用一个静态可导入对象。我尝试了ownerInjection,它似乎正在工作。我似乎不知道如何从初始值设定项中注入所有者。@Taztingo你想做什么?
myClass.create(Ember.getOwner(this).ownerInjection(), {...});