AngularJS页面内的多个ng-app

Nit*_*esh 181 angularjs

我刚开始学习Angular JS并创建了一些基本样本,但是我遇到了以下问题.

我创建了2个模块和2个控制器.

shoppingCart -> ShoppingCartController
namesList -> NamesController
Run Code Online (Sandbox Code Playgroud)

每个控制器都有相关的视图.第一个视图呈现正常,但第二个不呈现.没有错误.

http://jsfiddle.net/ep2sQ/

请帮我解决这个问题.

也有可能在View中添加控制台以检查从Controller传递的值.

例如,在下面的div中我们可以添加console.log并输出控制器值

<div ng-app="shoppingCart" ng-controller="ShoppingCartController">
</div>
Run Code Online (Sandbox Code Playgroud)

Nit*_*esh 187

所以基本上如切尔尼夫所提到的,我们需要引导模块在同一页面中拥有多个ng-app.非常感谢所有的投入.

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']);
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)

  • 角度文档说,当手动引导应用程序时,不要使用ngApp指令.所以ng-app ="namesList"(可能/应该)被重新调整.https://docs.angularjs.org/guide/bootstrap (33认同)
  • 对于那些在两个单独的js文件中有ng-app的人,下面的代码可能有助于angular.element(document).ready(function(){angular.bootstrap(document.getElementById("App2"),['namesList']) ;}); (4认同)
  • 注意:在我的应用程序中,我必须将此行设置为"angular.bootstrap(document.getElementById("App2"),['namesList']);" 在$(document).ready函数中 (3认同)
  • 您可以创建一个指令来代替http://stackoverflow.com/a/22898036/984780 (2认同)

Alw*_*ner 120

要在HTML文档中运行多个应用程序,必须使用angular.bootstrap()手动引导它们.

HTML

<!-- Automatic Initialization -->
<div ng-app="myFirstModule">
    ...
</div>
<!-- Need To Manually Bootstrap All Other Modules -->
<div id="module2">
    ...
</div>
Run Code Online (Sandbox Code Playgroud)

JS

angular.
  bootstrap(document.getElementById("module2"), ['mySecondModule']);
Run Code Online (Sandbox Code Playgroud)

原因是每个HTML文档只能自动引导一个AngularJS应用程序.ng-app在文档中找到的第一个将用于定义作为应用程序自动引导的根元素.

换句话说,虽然技术上每页可以有多个应用程序,但只有一个ng-app指令将由Angular框架自动实例化和初始化.

  • 每个HTML文档只能有一个`ngApp`指令*自动启动*,但只要您手动引导后续文件,就可以拥有多个应用程序. (20认同)
  • @AndroidDev,我不跟随.您引用的链接不会显示多个ng-app属性. (3认同)

Lui*_*rez 41

你可以angular.bootstrap()直接使用......问题是你失去了指令的好处.

首先,您需要获取对HTML元素的引用以引导它,这意味着您的代码现在已经与您的HTML相关联.

其次,两者之间的联系并不明显.有了ngApp你可以清楚地看到HTML是什么模块相关联,你知道去哪里找这方面的资料.但是angular.bootstrap()可以从代码中的任何位置调用.

如果您打算以最好的方式完成它将使用指令.这就是我做的.它被称为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>
Run Code Online (Sandbox Code Playgroud)

您可以在以下位置获取源代码:

http://www.simplygoodcode.com/2014/04/angularjs-getting-around-ngapp-limitations-with-ngmodule/

它的实现方式与ngApp.相同.它只是angular.bootstrap()在幕后调用.

  • 看起来像管理多个控制器的完美解决方案 (3认同)

Sae*_*ini 9

在我的情况下,我必须包装我的第二个应用程序的引导,angular.element(document).ready以使其工作:

angular.element(document).ready(function() {
  angular.bootstrap(document.getElementById("app2"), ["app2"]);
});   
Run Code Online (Sandbox Code Playgroud)


小智 7

以下是一个html页面中的两个应用程序和一个应用程序中的两个控制器的示例:

    <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>
Run Code Online (Sandbox Code Playgroud)


小智 6

您可以在一个rootModule中合并多个模块,并将该模块作为ng-app分配给上级元素ex:body标记.

代码ex:

    <!DOCTYPE html>
<html>
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.3.14/angular.min.js"></script>
<script src="namesController.js"></script>
<script src="myController.js"></script>
<script>var rootApp = angular.module('rootApp', ['myApp1','myApp2'])</script>
<body ng-app="rootApp">

<div ng-app="myApp1" ng-controller="myCtrl" >
First Name: <input type="text" ng-model="firstName"><br>
Last Name: <input type="text" ng-model="lastName"><br>
<br>
Full Name: {{firstName + " " + lastName}}
</div>

<div ng-app="myApp2" ng-controller="namesCtrl">
<ul>
  <li ng-bind="first">{{first}}
  </li>
</ul>
</div>

</body>
</html>
Run Code Online (Sandbox Code Playgroud)

  • 您正在rootApp中嵌套两个不同的应用程序,Angular不允许嵌套应用程序 (4认同)