在[备忘录]中,使用AngularJS动态添加控制器
希望通过事件动态加载控制器,但是在执行angular.bootstrap()后,即使通过app.controller(‘XXX’)进行添加,也会出现Error: [ng:areq] Argument ‘XXX’ is not a function, got undefined的错误。
请将以下内容用汉语进行同义转述: ↓
请将以下内容用中文进行同义转述。
使用angular.config()方法来设置controllerProvider,然后使用controllerProvider.register()方法进行添加。
– 示例
在下面的HTML代码的HogeController#doClick()中动态添加元素,
当点击其中的按钮时触发事件。
<!DOCTYPE html>
<html lang="ja" >
<head>
<meta charset="utf-8">
<title>angular test 1</title>
<script src="dist/js/lib/jquery/jquery-2.1.0.js"></script>
<script src="dist/js/lib/angularjs/angular.js"></script>
<script src="dist/js/app/main.js?hoge"></script>
</head>
<body>
<div ng-controller="HogeController as HogeC">
<button type="button" ng-click="HogeC.doClick()" >click</button>
</div>
<div>hello</div>
<div>
<testWidget/>
</div>
</body>
</html>
为了执行按钮点击事件,动态地将FugaController添加到testWidget。
<testWidgetSub ng-controller='FugaController'>
<div >tttt
<button type='button'ng-click='doFuga()'>Fuga!</buffon>
</div>
</testWidgetSub>
以下是JavaScript的代码。
var app = angular.module('app' ,[]);
app.controller('HogeController' ,[
'$scope', '$compile',
function($scope ,$compile ) {
this.doClick = function() {
console.log('click');
var elm = angular.element('testWidget testWidgetSub');
console.log(elm.size());
if (elm.size() == 0) {
// エレメントが、まだ、追加されてない場合
// コントローラーを追加
app.controllerProvider.register('FugaController', [
'$scope', '$compile',
function($scope ,$compile) {
$scope.doFuga = function() {
// fugaボタンを押した時のイベント
console.log('fuga controller clicked!!!');
};
}
]);
var hoge = $compile("<testWidgetSub ng-controller='FugaController'><div >{{'tttt'}}<button type='button'ng-click='doFuga()'>Fuga!</buffon></div></testWidgetSub>")($scope);
// 作ったエレメントのコンパイル
app.directive('testWidgetSub' ,
function(scope) {
scope.$apply();
});
// エレメント追加
angular.element('testWidget').append(hoge);
console.log('append testWidgetSub on testWidget!!!!!');
} else {
console.log('already append testWidgetSub....');
}
}
}
]);
// DOMのロード完了時に実行しないと、Chromeでエラーになる場合がある
// なので、とりあえず、jqueryで、angular.bootstrap()を、実行...
$(function() {
// providerを登録
app.config(function($controllerProvider, $compileProvider, $filterProvider, $provide)
{
app.controllerProvider = $controllerProvider;
app.compileProvider = $compileProvider;
app.filterProvider = $filterProvider;
app.provide = $provide;
});
// bootstrap実行
angular.bootstrap(document, ['app']);
console.log("angular bootstrapped...");
});
在angular.module(‘app’)前声明之后,在进行bootstrap之前,需要执行app.config来设置controllerProvider。
在bootstrap之后,使用controllerProvider.register()来定义controller。