如何在一个页面中定义两个angular度的应用程序/模块?

我正在尝试将两个angular度的应用程序/模块添加到一个页面。 在下面的小提琴中,您可以看到,始终只有第一个在html代码中引用的模块才能正常工作,而第二个模块不会被angular度识别。

在这个小提琴中,我们只能执行doSearch2方法,而在这个小提琴中只有doSearch方法才能正常工作。

我正在寻找如何正确放置两个angular度模块到一个页面的方式。

每个HTML文档只能有一个AngularJS应用程序自动引导。 在文档中find的第一个ngApp将用于定义作为应用程序自动引导的根元素。 要在HTML文档中运行多个应用程序,您必须使用angular.bootstrap来手动引导它们。 AngularJS应用程序不能相互嵌套。 – http://docs.angularjs.org/api/ng.directive:ngApp

也可以看看

我创build了一个没有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在内部使用的代码没有限制。

你为什么要使用多个[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> 

您可以引导多个angular度应用程序,但是:

1)您需要手动引导它们

2)您不应该使用“文档”作为根,而是包含angular接口的节点:

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

这将是安全的。

我为使用多个模块和路由器插件的Angular应用程序制作了POC,以将子应用程序嵌套在单个页面应用程序中。 你可以在https://github.com/AhmedBahet/ng-sub-apps获得源代码;

希望这会有所帮助

手动引导这两个模块将工作。 看这个

  <!-- 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已被用来代替。

这可能不是直接的答案。 但是,引导ng-app请注意以下事情。

不要在使用包含ngIf,ngInclude和ngView的指令的元素上引导应用程序。 这样做会使应用程序$ rootElement和应用程序的注入器错位,导致animation停止工作,从应用程序外部无法访问注入器。

有关angular.bootstrap的更多信息,请查看文档 。