我试着在一个应用程序中给出两个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到相同的。
ngApp
当实例化多个angular应用程序时,你不能这样做。你不能这样做的原因是 在ngApp指令的文档中已有说明.
每个HTML文档中只能有一个AngularJS应用程序被自动引导。在文档中找到的第一个ngApp将被用来定义根元素作为一个应用程序来自动引导。如果要在一个HTML文档中运行多个应用程序,你必须使用angular.bootstrap来手动引导它们。AngularJS应用程序不能在彼此内部嵌套。
要 引导多个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应用程序上(app
与 bApp
,在上面的例子中)。)
你声称当你嵌套它们时,它是'工作'的,但你应该意识到 行不通,只是不会硬性崩溃。不要有多个angular应用程序嵌套。你会遇到奇怪的问题,特别是当你有多个变量的名字相同,绑定到了 $rootScope
.
如果你打算让两个Angular应用嵌套,那么就可以使用 可能的 但极富版本特性,容易以奇怪的方式破解。 这个Stack Overflow的答案谈到了它.
来自Angular官方文档 。
每个HTML文档中只能有一个AngularJS应用被自动引导。在文档中找到的第一个ngApp将被用来定义根元素,以自动引导为一个应用程序。如果要在一个HTML文档中运行多个应用程序,你必须使用angular.bootstrap来手动引导它们。. AngularJS应用之间不能相互嵌套。
来源于: https:/docs.angularjs.orgapingdirectivengApp。
如果问题是:为什么第二个例子能用,而第一个不能用,答案在上面的链接中> Angular需要将第一个ngApp放在页面的根元素附近(html
或 body
).
正如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=预览。