我正在尝试将两个角度应用程序/模块添加到一页。在下面的小提琴中,您可以看到始终只有 html 代码中引用的第一个模块可以正常工作,而第二个模块无法被 angular 识别。
在这个小提琴中,我们只能执行该doSearch2
方法,而在这个小提琴中,只有该doSearch
方法可以正常工作。
我正在寻找如何正确地将两个角度模块放入一页的方法。
每个 HTML 文档只能自动引导一个 AngularJS 应用程序。在文档中找到的第一个 ngApp 将用于定义根元素以自动引导为应用程序。要在 HTML 文档中运行多个应用程序,您必须使用 angular.bootstrap 手动引导它们。AngularJS 应用程序不能相互嵌套。-- http://docs.angularjs.org/api/ng.directive:ngApp
也可以看看
我创建了一个没有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>
您可以引导多个角度应用程序,但是:
1)您需要手动引导它们
2)您不应该使用“文档”作为根,而是包含角度接口的节点:
var todoRootNode = jQuery('[ng-controller=TodoController]');
angular.bootstrap(todoRootNode, ['TodoApp']);
这将是安全的。
手动引导两个模块都可以。看这个
<!-- 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-app
. id
已被使用。
我使用多个模块和路由器插座为 Angular 应用程序制作了一个 POC,以将子应用程序嵌套在单个页面应用程序中。您可以在以下位置获取源代码:https ://github.com/AhmedBahet/ng-sub-apps
希望这会有所帮助