Angular $injector - Angular的$timeout的未知提供者
Angular $injector - Angular的$timeout的未知提供者
我正在尝试在我的应用程序中的多个控制器中调用的方法中注入angular的$timeout
服务。然而,我总是遇到以下错误:
错误:[$injector:unpr] 未知的提供者:$timeoutProvider <- >$timeout
当然,$timeout
应该是已知的,因为它是一个angular服务,所以我不明白为什么会出现这个错误。
这是我的代码:
HTML: JAVASCRIPT: var app = angular.module('app', []); app.controller('sampleController', ['$scope', function($scope) { var _this = this; $scope.doit = function() { var $injector = angular.injector(); var $timeout = $injector.get('$timeout', _this); $timeout(function () { alert('ok'); }); }; }]);
这是一个演示问题的jsfiddle链接:
https://jsfiddle.net/fvw8zss5/
- 这不是关于这是否是一个不好的实践的问题。当然,这是一个不好的实践。这是关于为什么它不起作用的问题。
- 如果你知道如何使用JsFiddle,它将可以正常工作。
问题的原因是因为在controller的声明中没有注入$timeout服务。解决方法是将$timeout服务注入到controller的声明中。
app.controller('sampleController', ['$scope','$timeout', function($scope,$timeout) { // controller logic here }]);
然而,由于这个应用程序有很多控制器(大型应用程序),在所有这些控制器中都添加这个依赖项是不可行的。更合适的方法是将这个功能转化为一个服务,并在所有控制器中注入该服务。但是,目前来说这将是一项繁重的工作。如果找不到其他解决方案,那么这将是我要做的。
app.service('timeoutService', ['$timeout', function($timeout) { // service logic here }]); app.controller('sampleController', ['$scope','timeoutService', function($scope, timeoutService) { // controller logic here }]);
Angular的$injector - 未知提供者问题的原因是因为angular.injector()只能在应用程序中使用一次,而不是每个模块一次来获取注入器,并且您应该通过依赖注入来获取实例化的注入器。
解决方法是在列表中添加ng模块,这样可以通过创建新的注入器来“解决”这个问题(不推荐这样做)。
以下是解决该问题的更适当的解决方案和完整解释,请参考此答案。
我搜索和测试了大约4个小时,添加“ng”模块解决了我的问题。非常感谢!
请参考:[https://stackoverflow.com/questions/13400687](https://stackoverflow.com/questions/13400687)
Angular $injector - Unknown Provider for Angular's $timeout问题的出现的原因是在25个控制器中使用$timeout函数时,注入器无法找到对应的提供者。解决方法是通过依赖注入将$timeout函数注入到每个控制器中,或者使用$rootScope或服务来实现该功能。
下面是解决这个问题的两种方法:
方法一:使用$rootScope
在应用的根模块中添加以下代码:
angular.module('fooApp').run(['$rootScope', '$timeout', function($rootScope, $timeout) { $rootScope.doit = function() { //在这里插入使用$timeout的函数 }; }]);
然后在每个控制器中注入$rootScope,即可调用$rootScope.doit()函数。
方法二:使用服务
可以创建一个服务来封装需要在25个控制器中使用的函数,并将该服务注入到每个控制器中。
首先,创建一个名为"myService"的服务,代码如下:
angular.module('fooApp').service('myService', ['$timeout', function($timeout) { this.doit = function() { //在这里插入使用$timeout的函数 }; }]);
然后在每个控制器中注入"myService",即可调用myService.doit()函数。
无论是使用$rootScope还是服务,为了让一个函数在25个控制器中可用,都需要进行依赖注入。使用$rootScope需要在根模块中添加代码,并在每个控制器中注入$rootScope。而使用服务则需要创建一个封装函数的服务,并在每个控制器中注入该服务。根据个人偏好和应用的架构,选择合适的方法来解决问题。