Ошибка «Неизвестный поставщик» при получении загруженного контроллера

0

Я хочу, чтобы "MyController2" наследовал "MyController1", однако оба контроллера lazyloaded с помощью ocLazyLoad. Согласно Jussi Kosunen, ответ на этот вопрос (qaru.site/questions/12350/...), я создал функцию registerDynamic() для регистрации контроллеров, но он все еще сообщает следующую ошибку в строке с '$ контроллер 'в controller1.js:

Ошибка: [$ injector: unpr] Неизвестный поставщик: $ elementProvider <- $ element <- DataTableController

Мои коды такие.

Первый файл 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, я lazyload выше два.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 );
       }
   };
}]);

ОБНОВИТЬ

Официальная Угловая документация для ошибки "Неизвестный поставщик" говорит:

Попытка ввести один контроллер в другой также вызовет ошибку Неизвестного поставщика:

Может быть, мы просто не можем использовать контроллер инжектора в пыльник, даже используя $ controller service?

  • 0
    Попробуйте ввести сервис $ controller во второй контроллер
  • 0
    @csharpfolk Спасибо за указание на это. Я забыл это при написании вопроса. У меня было это в оригинальном коде. Вопрос отредактирован.
Показать ещё 2 комментария
Теги:
lazy-loading
oclazyload

1 ответ

1
Лучший ответ

Вы принимаете сообщение об ошибке из контекста.

Попытка ввести один контроллер в другой также вызовет ошибку Неизвестного поставщика:

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 <- $ element <- DataTableController

То, как я прочитал это, это то, что в вашем DataTableController вы пытаетесь ввести $element. $element не является сервисом, является локальным. Чтобы ввести $element в качестве локального с помощью $controller service:

$controller('DataTableController', {$scope: $scope, $element: value });
  • 0
    $element как локальный в контроллерах, введенных $compile , задокументирован в AngularJS $ Ссылки API-контроллеров - контроллеры . $element not local в контроллерах, введенных ngRoute , задокументирован в AngularJS ngRoute $ route API Reference - current . Что DataTableController делает с $element - это то, что вы должны исследовать.
  • 0
    Ты прав. Я использовал $ element в DataTableController . Это моя ошибка. Большое спасибо за отличный аналитический ответ.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню