Angularjs:配置使用提供程序中的服务的回调的好方法

时间:2013-09-25 08:54:44

标签: javascript angularjs

我需要在angularjs-provider中配置回调。

myApp.config(function(SomeProvider) {
    SomeProvider.defaultCallback = function(foo, bar) {
        console.log("foo: " + foo + ", bar: " + bar);
    }
})

问题是,我想在这个回调中使用服务。在此示例中,我想使用$log.log而不是console.log

我无法在配置块中注入所有这些服务,因为它们尚不存在。

问题是,如何在此可配置回调中使用服务?

4 个答案:

答案 0 :(得分:4)

找到解决方案:

您必须拥有$ 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);

答案 1 :(得分:1)

我知道这是一个老问题,但我也遇到了这个问题,并找到了一个更优雅的解决方案,可能对某人有所帮助。请注意,我的示例是用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方法的最简单用法。它提供了很大的灵活性,因此值得查看documentation

答案 2 :(得分:0)

请看这篇文章:dynamic provider options through app config AngularJS

就像我在评论IMHO中说的那样,你不能在配置块中使用服务(在回调或不回调中)..

此线程中的解决方案是使用JQuery API进行调用,然后引导角度...

答案 3 :(得分:0)

我遇到了类似的问题,我需要在配置块的回调中使用特定服务,但我无法访问回调提供程序。我发现将$ injector注入配置块本身并不起作用,因为它不能保证设置服务,而且特别是你似乎从配置运行时获得$ injector状态而不是回调被调用。鉴于我无法将实际回调改为始终直接注入$ injector,我能让它工作的唯一方法就是从dom中获取注入器。所以你最终得到这样的东西(注意ES6类的风格!)......

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

有点hacky,但要求是相当标准的,我正在使用本地模型包装器(Client)包装相关记录(示例中的客户端)。库(ng-token-auth)在配置块中设置回调,并希望具有一个参数的直接函数,无法传入$ injector。希望能帮助处于类似情况的人。