Javascript 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 我无法将所有这些服务注入我的配置块中,

我需要在angularjs提供程序内部配置回调

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