Angular $ injector - Angular的$ timeout的未知提供程序

时间:2015-10-07 19:30:26

标签: javascript angularjs

我试图在应用程序中的多个控制器中调用的方法中注入角度$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'); });
    };
}]);

这是一个证明问题的小问题:

Knockout documentation

  • 这不是一个关于这是不是一个坏习惯的问题。当然很糟糕。这是一个关于它无法正常工作的问题。
  • 如果您知道如何使用JsFiddle,JsFiddle将会起作用。

4 个答案:

答案 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'); });
            });
        }
    };
});