Я хочу, чтобы "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?
Вы принимаете сообщение об ошибке из контекста.
Попытка ввести один контроллер в другой также вызовет ошибку Неизвестного поставщика:
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 });
$element
как локальный в контроллерах, введенных $compile
, задокументирован в AngularJS $ Ссылки API-контроллеров - контроллеры . $element
not local в контроллерах, введенных ngRoute
, задокументирован в AngularJS ngRoute $ route API Reference - current . Что DataTableController
делает с $element
- это то, что вы должны исследовать.
DataTableController
. Это моя ошибка. Большое спасибо за отличный аналитический ответ.