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