Javascript Angularjs:配置在提供者中使用服务的回调的好方法
我需要在angularjs提供程序内部配置回调Javascript Angularjs:配置在提供者中使用服务的回调的好方法,javascript,angularjs,Javascript,Angularjs,我需要在angularjs提供程序内部配置回调 myApp.config(function(SomeProvider) { SomeProvider.defaultCallback = function(foo, bar) { console.log("foo: " + foo + ", bar: " + bar); } }) 问题是,我想在这个回调中使用服务。在本例中,我想使用$log.log而不是console.log 我无法将所有这些服务注入我的配置块中,
myApp.config(function(SomeProvider) {
SomeProvider.defaultCallback = function(foo, bar) {
console.log("foo: " + foo + ", bar: " + bar);
}
})
问题是,我想在这个回调中使用服务。在本例中,我想使用$log.log
而不是console.log
我无法将所有这些服务注入我的配置块中,因为它们还不存在
问题是,我如何在这个可配置回调中使用服务?看看这篇文章:
正如我在评论IMHO中所说,您不能在配置块中使用服务(无论是否在回调中)
此线程中的解决方案是使用JQuery API进行调用,然后引导…找到解决方案:
您必须有可用的$injector才能执行此操作。因此,每次调用回调时,都必须传入$injector:
myApp.config(function(SomeProvider) {
SomeProvider.defaultCallback = function(foo, bar, $injector) {
var $log = $injector.get("$log");
$log.log("foo: " + foo + ", bar: " + bar);
}
})
// ... callbacks will be called this way:
myObject.theCallback(foo, bar, $injector);
我知道这是一个老问题,但我也有这个问题,并找到了一个更优雅的解决方案,可能会帮助别人。请注意,我的示例是用coffeescript编写的 maklemenz使用
$injector
服务是正确的,但它应该隐藏在您的提供商代码中:
angular.module("myModule").provider "myService", () ->
defaultCallback = () ->
this.setDefaultCallback = (callback) ->
defaultCallback =
this.$get = ["$injector", ($injector) -> {
#...service code...
#when you want to invoke your callback:
$injector.invoke defaultCallback
#...more service code...
}]
return this
这种方法的主要优点是,您可以在回调中使用任何正常的角度注入符号:
#using implicit injection (not minification-safe!)
angular.module("myApp").config (myServiceProvider) ->
myServiceProvider.setDefaultCallback ($log) ->
$log.log "some message"
这是
$injector.invoke
方法的最简单用法。它提供了很大的灵活性,因此非常值得查看。我遇到了一个类似的问题,我需要在配置块的回调中使用特定的服务,但我没有访问回调提供程序的权限。我发现将$injector注入配置块本身并不起作用,因为它不能保证设置了服务,特别是您似乎从配置运行时而不是调用回调时获得$injector状态。考虑到我无法将实际回调更改为始终直接注入$injector,我唯一能让它工作的方法就是从dom中获取注入器。因此,您最终会得到这样的结果(请注意ES6类样式!)
有点老套,但要求相当标准,我用本地模型包装器(客户机)包装相关记录(示例中的客户机)。库(ng token auth)在配置块中设置回调,并希望使用一个带有一个参数的直接函数,而不能传入$injector。希望这能帮助有类似情况的人。您不能在配置块中使用提供程序。。。最好是在运行区使用它们,我希望你指的是服务,否则我不明白。无法在运行块中插入提供程序,因此无法在其中配置它们。那也太晚了,因为你已经准备好注入未配置的服务了是的,我是说服务。我知道,您只能在配置块中注入provider和constant,这就是这个问题的原因。我需要他们在我的电话里。不直接在配置块中。是的,但回调在配置块中。。有什么区别?你如何在没有注入的情况下获得服务?我知道你无论如何也做不到这是件好事:)据我所知,手动注射不是一个大问题。在测试中仍然可以像自动注入一样使用模拟服务。
class AppAuth {
static configure($authProvider) {
$authProvider.configure({
apiUrl: '',
handleAccountUpdateResponse: (response) => {
const injector = angular.element(document.getElementById('app')).injector();
const Client = injector.get('Client');
response.data.clients.forEach((client, index, clients) => {
clients[index] = new Client(client);
});
return response;
}
})
}
}
export default AppAuth