1つのページで2つの角度のアプリ/モジュールを定義する方法は?


118

2つの角のアプリ/モジュールを1つのページに追加しようとしています。以下のフィドルでは、htmlコードで参照されている最初のモジュールのみが常に正しく機能するのに対し、2番目のモジュールは角度で認識されないことがわかります。

このフィドルでdoSearch2メソッドのみを実行できますが、このフィドルではdoSearchメソッドのみが正しく機能します。

2つの角度モジュールを1つのページに正しく配置する方法を探しています。

回答:


123

HTMLドキュメントごとに自動ブートストラップできるAngularJSアプリケーションは1つだけです。ドキュメントで最初に見つかったngAppは、アプリケーションとして自動ブートストラップするルート要素を定義するために使用されます。HTMLドキュメントで複数のアプリケーションを実行するには、代わりにangular.bootstrapを使用して手動でアプリケーションをブートストラップする必要があります。AngularJSアプリケーションを相互にネストすることはできません。- http://docs.angularjs.org/api/ng.directive:ngApp

こちらもご覧ください


@MarkRajcokでは、HTMLドキュメントごとにモジュールを1つだけにするのは良い習慣でしょうか。AngularJSのメインページの「バックエンドをワイヤリングする」の例でng-app="project"は、「これにより、ページのさまざまな部分で実行されるモジュールを使用できるようになります」と記載されていますが、ngAppドキュメントには、「HTMLドキュメントごとに1つのディレクティブしか使用できない」と記載されています。
theblang 2013年

9
@mattblang、モジュールはAngularアプリケーションに関連付けられており、実際にはHTMLドキュメントではありません。通常、ページ/ドキュメントごとに1つのアプリのみが必要ですが、同じページ/ドキュメントで複数のAngularアプリケーション(それぞれが1つ以上のモジュールを使用できる)を実行する場合は、それぞれを手動でブートストラップする必要があります- -使用しないでくださいng-app(機能しないため)。 ng-appHTMLドキュメントごとに1回だけ使用できます。ページにアプリが1つしかない場合、これは実際には単なるショートカットです。これは通常のケースです。
Mark Rajcok 2013年

1
この例はありますか?簡潔なブーストラップAPIのドキュメントは表示されますが、機能させることができません。私はしばらくこれをググってみましたが、単一の実用的な例はないようです。さらに、これはルートでどのように機能しますか?明らかに衝突の問題があります。
ロバートクリスチャン

また、ng-appを使用して、ページのどの部分がどのモジュールによって制御されているかを別の開発者に正確に示す方法も本当に気に入っています。これを実現するためにページでマークアップを使用する方法はありませんか?または、少なくとも、マークアップのヒントはありますか?
chrismarx 2013

1
ng-appディレクティブの最初の2つの段落はすべてを示しています-docs.angularjs.org/api/ng.directive:ngApp
simo

38

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が内部的に使用するコードと同じですが、制限はありません。


luisperezphd:私はあなたのブログ投稿を読みました。アプリをネストする方法(AJAXが読み込まれたウィジェットを備えたウィジェットビルダーなど)や、ページに既にアプリがあるかどうかを検出し、別のアプリを最初のアプリの依存関係として挿入する方法はありますか?私がここに質問を投稿したところ、自分が達成しようとしていることの詳細がわかりました。ありがとう!
Daniel Bonnell、2016年

@ACIDSTEALTH要素がすでにブートストラップされていることをAngularJSが報告しているという事実は、何らかの方法で通知する必要があることを意味します-そのコードはAngularJSの内部にある可能性があります。調べるには、AngularJSの非縮小バージョンとそのエラーのブレークポイントを参照して、if条件を確認します。StackOverflowの質問リンクからわかることから、実行時にモジュールを動的に「挿入」したいようです。あなたがこの記事を見て撮りたいかもしれませんので、もし:weblogs.asp.net/dwahlin/...を
ルイス・ペレス

@LuisPerezさん、ウェブサイトを確認しました。マシンで疲れた。angularJSは "ng-modules" / "ng-module"を検出していません。ファイルに参照を含める必要がありますか?
sujay kodamala 2016年

はい、@ sujaykodamala、ngModuleはAngularJSに組み込まれていません。これは私が作成したディレクティブです。GitHubからダウンロードできます。あなたはここでそれを見つけることができます:github.com/luisperezphd/ngModule
ルイス・ペレス

@ルイス・ペレスこんにちは!私はあなたのブログ投稿をチェックしていました、そして彼らは本当に素晴らしいです。時間があれば、こちらの投稿をチェックして問題を解決してください-stackoverflow.com/questions/46952478/…。ありがとう。
user8512043 2017年

19

複数の[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>


2つのモジュールの順序を逆にしようとしましたか?(「app」の前の「otherModule」)私はこのソリューションを頻繁に使用しており、完全に機能します...
Monkey Monk

1
OK !私が提供するJavascriptの例にエラーがあります。直ったと思います!記録のために、同じモジュールに対して2か所でセッター構文​​を使用します...これは明らかに許可されていません!:-)
モンキーモンク

私たちがそれを行うためのポーズ
Harry Bosh 2017

9

複数の角度アプリケーションをブートストラップできますが、

1)それらを手動でブートストラップする必要があります

2)ルートとして「ドキュメント」を使用するのではなく、次の目的で角度インターフェイスが含まれるノードを使用する必要があります。

var todoRootNode = jQuery('[ng-controller=TodoController]');
angular.bootstrap(todoRootNode, ['TodoApp']);

これは安全でしょう。


3

両方のモジュールの手動ブートストラップは機能します。これ見て

  <!-- 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-appid代わりに使用されています。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.