4

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

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

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

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

问题是,我如何在这个可配置的回调中使用服务?

4

4 回答 4

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);
于 2013-09-25T09:52:17.783 回答
1

我知道这是一个老问题,但我也遇到了这个问题,并找到了一个更优雅的解决方案,可能会对某人有所帮助。请注意,我的示例是用咖啡脚本编写的。

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方法。它提供了很大的灵活性,因此非常值得查看它的文档

于 2016-03-24T17:13:57.320 回答
0

看看这篇文章:通过应用程序配置AngularJS动态提供者选项

就像我在评论中说的恕我直言,您不能在配置块中使用服务(无论是否在回调中)..

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

于 2013-09-25T09:32:09.193 回答
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

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

于 2017-01-02T00:48:03.027 回答