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

Angularjs: Good way to configure callbacks which use services in providers

本文关键字:服务 回调 方法 程序 配置 Angularjs      更新时间:2023-09-26

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

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

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

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

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

找到了一个解决方案:

您必须具有可用的$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);
我知道

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

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

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

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

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

我遇到了类似的问题,我需要在配置块的回调中使用特定服务,但我无法访问回调提供程序。我发现将$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。希望能帮助有类似情况的人。