AngularJS Multiple ng-app within a page

后端 未结 13 2195
闹比i
闹比i 2020-11-22 01:48

I have just started learning Angular JS and created some basic samples however I am stuck with the following problem.

I have created 2 modules and 2 controllers.

相关标签:
13条回答
  • 2020-11-22 02:20

    Use angular.bootstrap(element, [modules], [config]) to manually start up AngularJS application (for more information, see the Bootstrap guide).

    See the following example:

    // root-app
    const rootApp = angular.module('root-app', ['app1', 'app2']);
    
    // app1
    const app1 = angular.module('app1', []);
    app1.controller('main', function($scope) {
      $scope.msg = 'App 1';
    });
    
    // app2
    const app2 = angular.module('app2', []);
    app2.controller('main', function($scope) {
      $scope.msg = 'App 2';
    });
    
    // bootstrap
    angular.bootstrap(document.querySelector('#app1'), ['app1']);
    angular.bootstrap(document.querySelector('#app2'), ['app2']);
    <!-- angularjs@1.7.0 -->
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.7.0/angular.min.js"></script>
    
    <!-- root-app -->
    <div ng-app="root-app">
    
      <!-- app1 -->
      <div id="app1">
        <div ng-controller="main">
          {{msg}}
        </div>
      </div>
    
      <!-- app2 -->
      <div id="app2">
        <div ng-controller="main">
          {{msg}}
        </div>
      </div>
    
    </div>

    0 讨论(0)
  • 2020-11-22 02:21

    So basically as mentioned by Cherniv we need to bootstrap the modules to have multiple ng-app within the same page. Many thanks for all the inputs.

    var shoppingCartModule = angular.module("shoppingCart", [])
    shoppingCartModule.controller("ShoppingCartController",
      function($scope) {
        $scope.items = [{
          product_name: "Product 1",
          price: 50
        }, {
          product_name: "Product 2",
          price: 20
        }, {
          product_name: "Product 3",
          price: 180
        }];
        $scope.remove = function(index) {
          $scope.items.splice(index, 1);
        }
      }
    );
    var namesModule = angular.module("namesList", [])
    namesModule.controller("NamesController",
      function($scope) {
        $scope.names = [{
          username: "Nitin"
        }, {
          username: "Mukesh"
        }];
      }
    );
    angular.bootstrap(document.getElementById("App2"), ['namesList']);
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.3/angular.min.js"></script>
    
    <div id="App1" ng-app="shoppingCart" ng-controller="ShoppingCartController">
      <h1>Your order</h1>
      <div ng-repeat="item in items">
        <span>{{item.product_name}}</span>
        <span>{{item.price | currency}}</span>
        <button ng-click="remove($index);">Remove</button>
      </div>
    </div>
    
    <div id="App2" ng-app="namesList" ng-controller="NamesController">
      <h1>List of Names</h1>
      <div ng-repeat="_name in names">
        <p>{{_name.username}}</p>
      </div>
    </div>

    0 讨论(0)
  • 2020-11-22 02:22

    Here's an example of two applications in one html page and two conrollers in one application :

        <div ng-app = "myapp">
          <div  ng-controller = "C1" id="D1">
             <h2>controller 1 in app 1 <span id="titre">{{s1.title}}</span> !</h2>
          </div>
    
          <div  ng-controller = "C2" id="D2">
             <h2>controller 2 in app 1 <span id="titre">{{s2.valeur}}</span> !</h2>
          </div>
        </div>
        <script>
            var A1 = angular.module("myapp", [])
    
            A1.controller("C1", function($scope) {
                $scope.s1 = {};
                $scope.s1.title = "Titre 1";
             });
    
            A1.controller("C2", function($scope) {
                $scope.s2 = {};
                $scope.s2.valeur = "Valeur 2";
             });
        </script>
    
        <div ng-app="toapp" ng-controller="C1" id="App2">
            <br>controller 1 in app 2
            <br>First Name: <input type = "text" ng-model = "student.firstName">
            <br>Last Name : <input type="text" ng-model="student.lastName">
            <br>Hello : {{student.fullName()}}
            <br>
        </div>
    
        <script>
            var A2 = angular.module("toapp", []);
            A2.controller("C1", function($scope) {
                $scope.student={
                    firstName:"M",
                    lastName:"E",
                    fullName:function(){
                        var so=$scope.student;
                        return so.firstName+" "+so.lastName;
                    }
                };
            });
            angular.bootstrap(document.getElementById("App2"), ['toapp']);
        </script>
    <style>
        #titre{color:red;}
        #D1{ background-color:gray; width:50%; height:20%;}
        #D2{ background-color:yellow; width:50%; height:20%;}
        input{ font-weight: bold; }
    </style>
    

    0 讨论(0)
  • 2020-11-22 02:23

    In my case I had to wrap the bootstrapping of my second app in angular.element(document).ready for it to work:

    angular.element(document).ready(function() {
      angular.bootstrap(document.getElementById("app2"), ["app2"]);
    });   
    
    0 讨论(0)
  • 2020-11-22 02:28

    I have modified your jsfiddle, can make top most module as rootModule for rest of the modules. Below Modifications updated on your jsfiddle.

    1. Second Module can injected in RootModule.
    2. In Html second defined ng-app placed inside the Root ng-app.

    Updated JsFiddle: http://jsfiddle.net/ep2sQ/1011/

    0 讨论(0)
  • 2020-11-22 02:30

    To run multiple applications in an HTML document you must manually bootstrap them using angular.bootstrap()

    HTML

    <!-- Automatic Initialization -->
    <div ng-app="myFirstModule">
        ...
    </div>
    <!-- Need To Manually Bootstrap All Other Modules -->
    <div id="module2">
        ...
    </div>
    

    JS

    angular.
      bootstrap(document.getElementById("module2"), ['mySecondModule']);
    

    The reason for this is that only one AngularJS application can be automatically bootstrapped per HTML document. The first ng-app found in the document will be used to define the root element to auto-bootstrap as an application.

    In other words, while it is technically possible to have several applications per page, only one ng-app directive will be automatically instantiated and initialized by the Angular framework.

    0 讨论(0)
提交回复
热议问题