Angularjs 如何将$location注入配置函数中定义的单击事件处理程序

Angularjs 如何将$location注入配置函数中定义的单击事件处理程序,angularjs,angularjs-injector,Angularjs,Angularjs Injector,我正在修改一些代码,这些代码是AngularJS分析框架的插件。在插件中,我希望访问$location对象,该对象本质上是$routeChangeSuccess处理程序。事件处理程序是在配置函数中定义的,但当代码实际执行时,我的理解是$location应该可用 以下操作不起作用: angular.module('myModule', ['angulartics']) .config(['$analyticsProvider','$injector', function ($analyticsPr

我正在修改一些代码,这些代码是AngularJS分析框架的插件。在插件中,我希望访问
$location
对象,该对象本质上是
$routeChangeSuccess
处理程序。事件处理程序是在配置函数中定义的,但当代码实际执行时,我的理解是$location应该可用

以下操作不起作用:

angular.module('myModule', ['angulartics'])
.config(['$analyticsProvider','$injector', function ($analyticsProvider, $injector) {
  $analyticsProvider.registerPageTrack(function (path) {
    // The following runs on $routeChangeSuccess
    $injector.invoke(['$location',function($location) {
      try {
          analytics.page({
            path: path,
            url: $location.absUrl()
          });
      } catch (e) {
          if (!(e instanceof ReferenceError)) {
              throw e;
          }
      }
    }]);
  });

  $analyticsProvider.registerEventTrack(function (action, properties) {
    try {
      analytics.track(action, properties);
    } catch (e) {
        if (!(e instanceof ReferenceError)) {
            throw e;
        }
    }
  });
}]);
})(angular);
在这种情况下,
$injector
无法找到
$location
服务。通过进一步挖掘,我发现这是因为我拥有的喷油器实际上是(因为这是由
config
函数提供给我的),而不是(具有
$location


我有没有办法得到实例注入器,而不是提供者注入器?我非常确信,当代码实际运行时,实例注入器是完全可用的。如果我错了,那我也想知道!谢谢

当然,您可以这样做
var$injector=angular.element(document.documentElement.injector();var$location=$injector.get(“$location”)。。但这不好,谢谢!我同意这不是很优雅。这种方法的潜在缺点是什么?我认为可能很难进行单元测试。。。还有其他问题吗?我在尝试使用
$location
进行分析时遇到了同样的问题。我最终使用了
$window
,并用
$window.location.pathname
获取url。