1つのページに2つのAngularアプリ/モジュールを追加しようとしています。以下のフィドルでは、htmlコードで参照されている最初のモジュールのみが常に正しく機能するのに対し、2番目のモジュールはAngularによって認識されないことがわかります。
このフィドルではメソッドのみを実行できますがdoSearch2
、このフィドルではメソッドのみがdoSearch
正しく機能します。
2つのAngularモジュールを1つのページに正しく配置する方法を探しています。
HTMLドキュメントごとに自動ブートストラップできるAngularJSアプリケーションは1つだけです。ドキュメントで最初に見つかったngAppは、アプリケーションとして自動ブートストラップするルート要素を定義するために使用されます。HTMLドキュメントで複数のアプリケーションを実行するには、代わりにangular.bootstrapを使用して手動でアプリケーションをブートストラップする必要があります。AngularJSアプリケーションを相互にネストすることはできません。--http ://docs.angularjs.org/api/ng.directive:ngApp
も参照してください
ngApp
の制限がない代替ディレクティブを作成しました。それはと呼ばれngModule
ます。これを使用すると、コードは次のようになります。
<!DOCTYPE html>
<html>
<head>
<script src="angular.js"></script>
<script src="angular.ng-modules.js"></script>
<script>
var moduleA = angular.module("MyModuleA", []);
moduleA.controller("MyControllerA", function($scope) {
$scope.name = "Bob A";
});
var moduleB = angular.module("MyModuleB", []);
moduleB.controller("MyControllerB", function($scope) {
$scope.name = "Steve B";
});
</script>
</head>
<body>
<div ng-modules="MyModuleA, MyModuleB">
<h1>Module A, B</h1>
<div ng-controller="MyControllerA">
{{name}}
</div>
<div ng-controller="MyControllerB">
{{name}}
</div>
</div>
<div ng-module="MyModuleB">
<h1>Just Module B</h1>
<div ng-controller="MyControllerB">
{{name}}
</div>
</div>
</body>
</html>
ソースコードは次の場所で入手できます。
http://www.simplygoodcode.com/2014/04/angularjs-getting-around-ngapp-limitations-with-ngmodule/
これは基本的に、制限なしでAngularJSによって内部的に使用されるコードと同じです。
なぜ複数の[ng-app]を使いたいのですか?モジュールを使用してAngularを再開するため、複数の依存関係を使用するアプリを使用できます。
Javascript:
// setter syntax -> initializing other module for demonstration
angular.module('otherModule', []);
angular.module('app', ['otherModule'])
.controller('AppController', function () {
// ...do something
});
// getter syntax
angular.module('otherModule')
.controller('OtherController', function () {
// ...do something
});
HTML:
<div ng-app="app">
<div ng-controller="AppController">...</div>
<div ng-controller="OtherController">...</div>
</div>
編集
コントローラ内でコントローラを使用する場合は、次のようにcontrollerAs構文を使用する必要があることに注意してください。
<div ng-app="app">
<div ng-controller="AppController as app">
<div ng-controller="OtherController as other">...</div>
</div>
</div>
複数のAngularアプリケーションをブートストラップできますが、次のようになります。
1)手動でブートストラップする必要があります
2)ルートとして「ドキュメント」を使用するのではなく、角度インターフェイスが含まれるノードを次の目的で使用する必要があります。
var todoRootNode = jQuery('[ng-controller=TodoController]');
angular.bootstrap(todoRootNode, ['TodoApp']);
これは安全です。
両方のモジュールを手動でブートストラップすることは機能します。これを見てください
<!-- IN HTML -->
<div id="dvFirst">
<div ng-controller="FirstController">
<p>1: {{ desc }}</p>
</div>
</div>
<div id="dvSecond">
<div ng-controller="SecondController ">
<p>2: {{ desc }}</p>
</div>
</div>
// IN SCRIPT
var dvFirst = document.getElementById('dvFirst');
var dvSecond = document.getElementById('dvSecond');
angular.element(document).ready(function() {
angular.bootstrap(dvFirst, ['firstApp']);
angular.bootstrap(dvSecond, ['secondApp']);
});
Plunkerへのリンクは次のとおりです http://plnkr.co/edit/1SdZ4QpPfuHtdBjTKJIu?p=preview
注: htmlには、はありませんng-app
。id
代わりに使用されています。
複数のモジュールとルーターアウトレットを使用してAngularアプリケーションのPOCを作成し、サブアプリを1ページのアプリにネストしました。ソースコードはhttps://github.com/AhmedBahet/ng-sub-appsで入手できます。
これがお役に立てば幸いです