我试图在应用程序中的多个控制器中调用的方法中注入角度$timeout
服务。但是,我总是收到错误:
错误:[$ injector:unpr]未知提供商:$ timeoutProvider< - > $ timeout
当然$timeout
必须知道,因为它是一个有角度的服务,所以我不明白为什么会发生这种错误。
这是我的代码:
HTML:
<div ng-app="app" ng-controller="sampleController">
<button ng-click="doit()">Do It!</button>
</div>
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'); });
};
}]);
这是一个证明问题的小问题:
答案 0 :(得分:2)
angular.injector()只能在每个应用程序中使用一次而不是每个模块使用以获取进样器,您应该使用$ injector通过DI来获取实例化的进样器。 话虽这么说,将ng模块添加到列表中会通过创建新的注入器“解决”问题(不推荐)
请查看this answer以获取有关此问题的完整说明和更合适的解决方案。
答案 1 :(得分:1)
我想我得到了你所说的,你想要一个可用于所有25个控制器的功能,而不必为所有25个控制器进行依赖注入,而你不想做服务,因为你必须将此服务注入所有25个控制器。
老实说,如果你希望这个功能可以在25个控制器上使用,你将不得不对所有25个进行DI,无论是$ timeout,service还是$ rootScope方法
假设您的所有25个控制器都没有父控制器,这里是$ rootScope版本:
angular.module('fooApp').run(['$rootScope', '$timeout', function($rootScope, $timeout) {
$rootScope.doit = function() {
//Insert function here with $timeout
};
}]);
您必须在所有控制器中注入$ rootScope才能运行此功能。
我认为你最好的选择是使用恕我直言的服务,或者至少下次设置你的应用程序,以便你有一个父控制器。
答案 2 :(得分:0)
为什么不将它注入控制器声明
app.controller('sampleController', ['$scope','$timeout', function($scope,$timeout)
答案 3 :(得分:0)
为什么不使用指令而不是在每个控制器中重复工作?
<div ng-app="app" ng-controller="sampleController">
<button do-it>Do It!</button>
</div>
对于剧本方:
app.directive('doIt', function ($timeout) {
return {
restrict: 'A',
link: function ($scope, $element, $attr) {
$element.on('click', function () {
$timeout(function () { alert('ok'); });
});
}
};
});