【问题标题】:'Unknown provider' error while retrieving lazy-loaded controller检索延迟加载的控制器时出现“未知提供程序”错误
【发布时间】:2016-01-28 15:46:34
【问题描述】:

我希望“MyController2”继承“MyController1”,但是,两个控制器都是使用 ocLazyLoad 进行延迟加载的。根据 Jussi Kosunen 对这个问题的回答 (https://stackoverflow.com/a/15292441/2197555),我做了一个函数 registerDynamic() 来注册控制器,但它仍然在 '$controller' 行报告以下错误在 controller1.js 中:

错误:[$injector:unpr] 未知提供者:$elementProvider

我的代码是这样的。

第一个文件controller1.js

angular.module( 'myApp',[])
    .controller( 'MyController1', [ function($scope){
        // ...
    }]);

第二个文件controller2.js:

angular.module( 'myApp')
    .controller( 'MyController2', [ '$controller', '$scope',function($controller, $scope){
         $controller('MyController1', {$scope: $scope }); // here triggers error '[$injector:unpr] Unknown provider'
         // ...
    }]);

在第三个文件lazy-load.js中,我懒加载了上面两个.js文件:

var app = angular.module('myApp'),
queueLen = app._invokeQueue.length;
app.directive( 'LazyLoad', [ function( ){
    return {
        restrict: 'EA',
        scope: {
           src: '@',
        },
        link: function( scope, element, attr ){
            var registerDynamic = function() {
                // Register the controls/directives/services we just loaded
                var queue = syncreonApp._invokeQueue;
                for(var i=queueLen;i<queue.length;i++) {
                    var call = queue[i];
                    // call is in the form [providerName, providerFunc, providerArguments]
                    var provider = syncreonApp.providers[call[0]];
                    if(provider) {
                        // e.g. $controllerProvider.register("Ctrl", function() { ... })
                        $log.debug("Registering " + call[1] + " " + call[2][0] + " ...");
                        provider[call[1]].apply(provider, call[2]);
                    }
                }
                queueLen = i;
            },
            loadMultipleJs = function ( js_files ){
                var deferred = $q.defer();
                var js_file1 = js_files.shift(),
                    js_file2 = js_files.shift();

                 $ocLazyLoad.load( js_file1 )
                    .then ( function(){
                        registerDynamic();
                        $ocLazyLoad.load( js_file2 )
                            .then ( function(){
                                registerDynamic();
                                deferred.resolve();
                            }, function(){
                                deferred.reject();
                            });
                    }, function(){
                        deferred.reject();
                    });
           };
           jsonOfJsFilesToLoad = JSON.parse(scope.src);
           loadMultipleJs(jsonOfJsFilesToLoad );
       }
   };
}]);

更新

The official Angular documentation for 'Unknown Provider' error 说:

尝试将一个控制器注入另一个控制器也会引发 Unknown provider 错误:

也许即使使用 $controller 服务,我们也无法将控制器注入花药?

【问题讨论】:

  • 尝试将$controller服务注入第二个控制器
  • @csharpfolk 感谢您指出这一点。我写问题的时候忘记了。我在原始代码中有它。问题已编辑。
  • 你当然可以在一个控制器中实例化另一个控制器,参见use case for $controller service in angularjs。所以在别处寻找你的问题。你想在哪里注入$element$element 不是服务。它是由$compile 提供的本地
  • @georgeawg 我认为我没有在任何地方注入$element

标签: angularjs lazy-loading oclazyload


【解决方案1】:

您将错误消息断章取意。

尝试将一个控制器注入另一个控制器也会引发 Unknown provider 错误:

angular.module('myModule', [])
   .controller('MyFirstController', function() { /* ... */ })
   .controller('MySecondController', ['MyFirstController', function(MyFirstController) {
     // This controller throws an unknown provider error because
     // MyFirstController cannot be injected.
   }]);

这不是您实例化控制器的方式。

具体说:

如果您想自己实例化控制器,请使用 $controller 服务

正在实例化控制器的方式是什么。

在别处寻找您的问题。

您的错误信息:

未知提供者:$elementProvider

我的阅读方式是,在您的DataTableController 中,您正试图注入$element$element 不是服务,是本地。将$element 作为本地 注入$controller 服务:

$controller('DataTableController', {$scope: $scope, $element: value });

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-08
  • 2016-12-07
  • 2017-12-04
相关资源
最近更新 更多