gpt4 book ai didi

javascript - 配置服务(通过其提供者)以使用其他服务

转载 作者:行者123 更新时间:2023-11-29 22:02:38 24 4
gpt4 key购买 nike

我有一个服务,我希望能够通过传入一个函数来配置它以供使用。只要这个函数返回我的服务可以使用的东西,它不关心它是如何获取数据的,也不关心同步/异步。以下是我希望能够执行但由于明显原因无法执行的示例:

.config(function(MyServiceProvider, OtherService) {

MyServiceProvider.setSomeMethod( OtherService.someMethod );

})

那太棒了,但似乎没有办法从配置函数中引用“OtherService”。我知道这是因为 OtherService 可能还没有配置,因此它的一个实例不应该存在,但是在这种情况下,人们应该做什么呢?

(带着焦虑)在运行 block 中建立这种关联是否合适?

.run(function(MyService, OtherService) {

MyService.setSomeMethod( OtherService.someMethod );

})

最佳答案

使用 $injector稍后在 Bootstrap 稳定后解决依赖关系的服务。

例如:

angular.module('myApp').config(function(myProvider) {
myProvider.setMethod('myUberMethod');
});

// Somewhere in myProvider

var theUberMethod, theUberMethodName;

function setMethod(dependencyName) {
theUberMethodName = dependencyName;
}

function performTheMethod() {
theUberMethod = theUberMethod || $injector.get(theUberMethodName);

// Magic

theUberMethod();
}

您甚至可能想看一下$injectorinvoke 方法,因为它允许您将参数注入(inject)到被注入(inject)的函数方法中。

编辑

我必须更好地解释它。

您面临的问题与注入(inject)模块 未在配置阶段 初始化这一事实有关,因此您无法将服务注入(inject)到配置中功能。只允许 vendor 。您必须将任何依赖项解析推迟到配置阶段之后。这可以通过在提供者上使用 $get 函数或通过注入(inject) $injector 服务并使用它来进行解析来完成。

函数可以像任何其他对象一样注册为依赖注入(inject)。因此,向提供者提供函数的名称就足以让它在以后解析和执行它。

myApp.provider('myFunctionCallee', function() {

var self = this;

return {
hookMyFunction: function(value /* string: name of the function */ ) {
self.myFunction = value;
},
$get: function($injector) {
return {
executeMyFunction: function() {
return $injector.get(self.myFunction)();
}
};
}
};
});

现在我们需要一种方法来通知注入(inject)器函数。

例子一

这是最简单的...只需直接向注入(inject)器注册一个函数(对象)即可。我们将通过请求“myFunction”来解析函数。

myApp.value('myFunction', function() { 
return 'hello injected function!';
});

myApp.config(function(myFunctionCalleeProvider) {
myFunctionCalleeProvider.hookMyFunction('myFunction');
});

例子二

这个方法看起来很像上一个方法。我们将直接注册一个函数,但我们也会将其注入(inject)到我们的目标服务中。

myApp.value('myFunction', function() {
return 'hello injected service function 1';
});

myApp.factory('myService', function(myFunction) {
return {
myServiceFunction: myFunction
};
});

myApp.config(function(myFunctionCalleeProvider) {
myFunctionCalleeProvider.hookMyFunction('myFunction');
});

例子三

有时候以前的方法是行不通的。也许代码是由其他人编写的,他/她没有您拥有的这种远见。然而,我们可以在任何可注入(inject)对象上公开任何函数:

myApp.factory('myService', function() {
return {
// We want to target this beast
myServiceFunction: function() {
return 'hello injected service function 2';
}
};
});

// Inject the target service here ...
myApp.factory('myFunction', function(myService) {
// ... and expose the beast.
return myService.myServiceFunction;
});

myApp.config(function(myFunctionCalleeProvider) {
myFunctionCalleeProvider.hookMyFunction('myFunction');
});

你可以在这个plunker中看到、感受和舔它.

关于javascript - 配置服务(通过其提供者)以使用其他服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22773087/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com