Javascript Angular$injector-Angular'的未知提供程序;s$超时

Javascript Angular$injector-Angular'的未知提供程序;s$超时,javascript,angularjs,Javascript,Angularjs,我正在尝试将angular的$timeout服务注入到一个应该在我的应用程序中的几个控制器中调用的方法中。但是,我总是会遇到这样的错误: 错误:[$injector:unpr]未知提供程序:$timeoutProvider$timeout 当然,$timeout必须知道,因为它是一个角度服务,所以我不明白为什么会发生这个错误 这是我的代码: HTML: <div ng-app="app" ng-controller="sampleController"> <button

我正在尝试将angular的
$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'); });
    };
}]);
HTML:
做吧!
JAVASCRIPT:
var-app=angular.module('app',[]);
app.controller('sampleController',['$scope',function$scope){
var_this=这个;
$scope.doit=function(){
var$injector=angular.injector();
var$timeout=$injector.get('$timeout',\u this);
$timeout(函数(){alert('ok');});
};
}]);
这里有一个JSFIDLE演示了这个问题:


  • 这不是一个关于这是否是一个坏习惯的问题。当然不好。这是一个关于它为什么不起作用的问题
  • 如果您知道如何使用JSFIDLE,JSFIDLE将起作用

    • 为什么不直接将其注入控制器声明中

      app.controller('sampleController', ['$scope','$timeout', function($scope,$timeout)
      
      angular.injector()只能在每个应用程序中使用一次,而不是在每个模块中使用一次,以获取注入器,您应该通过DI使用$injector来获取实例化的注入器。 也就是说,将ng模块添加到列表中将通过创建新的喷油器来“解决”问题(不推荐)


      请查看完整的解释和更合适的解决方案。

      我想我明白您的意思,您希望所有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注入所有控制器才能运行此函数


      我认为你的最佳选择是通过IMHO使用服务,或者至少下次设置你的应用程序,这样你就有了一个父控制器

      为什么不使用指令而不是在每个控制器中重复工作

      <div ng-app="app" ng-controller="sampleController">
          <button do-it>Do It!</button>
      </div>
      

      我甚至不会拉小提琴。上面写着“模块”应用程序“无法实例化”或是一些奇怪的东西。你为什么要使用注入器?除非在非常特殊的情况下,@sg.cc您需要更改angular的加载方式,否则它确实是不受欢迎的。在顶部的框架和扩展中从onLoad更改为“no wrap-”left@sg.cc朱利安·罗伊说的话。我尝试将其保存为“no wrap-”,但它总是返回到“On Load”。@mxa055原因是此方法将在应用程序的多个控制器中使用。我不想在25个控制器上添加相同的功能。我也不想将“$timeout”依赖项添加到每个控制器中,因为这个方法将在大约25个控制器中使用(这是一个大型应用程序),我不想将这个依赖项添加到所有这些控制器中。正确的方法是将此功能转换为服务并将其注入所有控制器中,但现在这将是太多的工作。但是,如果我找不到任何其他解决方案,那就是我要做的。我为每个控制器都有一个父控制器,这样我就可以向父控制器添加一个函数,并在每个控制器中都有它。这绝对不是一个好的实践(以这种方式使用$injector),但现在,它解决了我的问题。接下来,我将把此功能抽象到一个服务中,然后将此服务注入所有控制器。啊,好的,如果是这样,那么您可以将$timeout注入父控制器,然后从25个控制器调用父函数,而无需执行$injector.get。如果你的父控制器是所有25个控制器的父控制器,那么,我使用的是typescript,对于父控制器的每个子控制器,我必须复制父控制器的每个依赖项。我没有找到一种方法来设置父对象上的依赖项,并且在子对象上只添加需要的依赖项。Angular倾向于组合而不是继承(这实际上是一种更好的选择),这就是我要将应用程序的体系结构迁移到的,但由于我必须使用已经完成的解决方案,我必须缓慢地迁移到新的体系结构。这也会起作用,如果$timeout中的逻辑也不依赖于控制器状态。在本例中,只需向控制器的超类添加一个方法就可以轻松得多。我搜索并测试了大约4个小时,添加“ng”模块解决了我的问题。谢谢
      app.directive('doIt', function ($timeout) {
          return {
              restrict: 'A',
              link: function ($scope, $element, $attr) {
                  $element.on('click', function () {
                      $timeout(function () { alert('ok'); });
                  });
              }
          };
      });