「MyController2」に「MyController1」を継承させたいのですが、両方のコントローラーが ocLazyLoad を使用して遅延ロードされます。この質問に対するJussi Kosune n の回答 ( https://stackoverflow.com/a/15292441/2197555 ) によると、コントローラーを登録する関数registerDynamic()
を作成しましたが、「$controller」の行で次のエラーが報告されます。 controller1.js で:
エラー: [$injector:unpr] 不明なプロバイダー: $elementProvider <- $element <- DataTableController
私のコードはこのようなものです。
最初のファイルcontroller1.js
:
angular.module( 'myApp',[])
.controller( 'MyController1', [ function($scope){
// ...
}]);
2 番目のファイルcontroller2.js
:
angular.module( 'myApp')
.controller( 'MyController2', [ '$controller', '$scope',function($controller, $scope){
$controller('MyController1', {$scope: $scope }); // here triggers error '[$injector:unpr] Unknown provider'
// ...
}]);
3 番目の Filelazy-load.js
では、上記の 2 つの .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 );
}
};
}]);
アップデート
「不明なプロバイダー」エラーの公式Angularドキュメントには次のように書かれています:
あるコントローラーを別のコントローラーに挿入しようとすると、不明なプロバイダー エラーもスローされます。
$controller サービスを使用しても、コントローラを葯にインジェクトできないのではないでしょうか?