多个ng-app在angular中是如何工作的(为什么会有这样的行为?

问题描述 投票:1回答:3

我试着在一个应用程序中给出两个ng-app,当我给出两个ng-app时,比如说

 <body>
    <div ng-app="A">
        <div ng-controller="AC">
        </div>
    </div>


    <div ng-app="B">
        <div ng-controller="BC">
        </div>
    </div>

</body>

然后第二个ng-app就不能用了。

但是当我把第一个ng-app="A "的范围从div改为body时,两个都能正常工作,比如

<body ng-app="A">
<div>
    <div ng-controller="AC">
    </div>
</div>


<div ng-app="B">
    <div ng-controller="BC">
    </div>
</div>
</body>

有谁能告诉我为什么会出现这种行为,因为我对angular.bootstrap很陌生,我想知道为什么会出现这种情况,因为我没有在第二种情况下调用angular.bootstrap.我试着搜索,但我没有得到它是如何工作的,当改变ng-app的范围从div到body。

找到相同的fiddle https:/jsfiddle.netmaddyjolly2112wyfd0djp1。 并介意复制js到相同的。

javascript angularjs angularjs-directive
3个回答
5
投票

医生说。不要用... ngApp 当实例化多个angular应用程序时,你不能这样做。

你不能这样做的原因是 在ngApp指令的文档中已有说明.

每个HTML文档中只能有一个AngularJS应用程序被自动引导。在文档中找到的第一个ngApp将被用来定义根元素作为一个应用程序来自动引导。如果要在一个HTML文档中运行多个应用程序,你必须使用angular.bootstrap来手动引导它们。AngularJS应用程序不能在彼此内部嵌套。

但是引导多个Angular应用是可能的......

引导多个Angular应用,你必须引用每一个,而且它们在逻辑上不能嵌套,也不能共享一个元素,它们需要相互独立。正因为如此,你不能使用指令。ngApp:

  <html>
    <head></head>
    <body>
    <script src="angular.js"></script>
    <div id="appElementA"></div>
    <div id="appElementB"></div>
    <script>
      var app = angular.module('A', [])
      .controller('AB', function($scope) {
          $scope.greeting = 'Welcome!';
      });
      var appElementA = document.getElementById('divAppA');
      angular.bootstrap(appElementA, ['A']);
    var bApp = angular.module('B', [])
      .controller('BB', function($scope) {
          $scope.greeting = 'Welcome to B app!';
      });
      var appElementB = document.getElementById('divAppB');
      angular.bootstrap(appElementB, ['B']);
    </script>
    </body>
    </html>

上面的代码将是你如何为你的应用程序做它。 然后,你必须确保你的控制器分配到正确的Angular应用程序上(appbApp,在上面的例子中)。)

但不要嵌套它们!

你声称当你嵌套它们时,它是'工作'的,但你应该意识到 行不通,只是不会硬性崩溃。不要有多个angular应用程序嵌套。你会遇到奇怪的问题,特别是当你有多个变量的名字相同,绑定到了 $rootScope.

但你可以在没有不良影响的情况下嵌套它们,对吗?

如果你打算让两个Angular应用嵌套,那么就可以使用 可能的 但极富版本特性,容易以奇怪的方式破解。 这个Stack Overflow的答案谈到了它.


0
投票

来自Angular官方文档 。

每个HTML文档中只能有一个AngularJS应用被自动引导。在文档中找到的第一个ngApp将被用来定义根元素,以自动引导为一个应用程序。如果要在一个HTML文档中运行多个应用程序,你必须使用angular.bootstrap来手动引导它们。. AngularJS应用之间不能相互嵌套。

来源于: https:/docs.angularjs.orgapingdirectivengApp。

如果问题是:为什么第二个例子能用,而第一个不能用,答案在上面的链接中> Angular需要将第一个ngApp放在页面的根元素附近(htmlbody).


0
投票

正如George所提到的,手动引导也可以。在html中,使用 id 而不是 ng-app.

在脚本中

var dvFirst = document.getElementById('dvFirst');
var dvSecond = document.getElementById('dvSecond');

angular.element(document).ready(function() {
   angular.bootstrap(dvFirst, ['firstApp']);
   angular.bootstrap(dvSecond, ['secondApp']);
});

这里有一个工作的灌篮机http:/plnkr.coedit1SdZ4QpPfuHtdBjTKJIu?p=预览。

© www.soinside.com 2019 - 2024. All rights reserved.