<body ng-app>
的使用方式和原因是什么?我们如何为这个无名模块分配控制器,指令等。还解释了这与手动引导Angular App有何关系。
Fiddle
答案 0 :(得分:3)
这实际上是三个不同的问题,但我很乐意解决每一个问题。
除非有该应用程序的入口点,否则Angular将无法并且无法正确引导应用程序。根据{{3}},如果没有传递一个为app实例命名的参数,angular将通过抓取DOM并使用遇到的第一个ngApp指令实例来尝试documentation该应用程序。
我们通常希望将我们的入口点放在<body>
元素上,以包含我们需要的所有潜在DOM,而不会使用<head>
元素混淆它,例如加载脚本和css。也就是说,如果您是自动引导您的应用程序,建议的位置是在HTML元素上
模块,控制器等必须附加到某些东西,以便Angular接收它们并正确地与它们进行交互。
一旦应用程序被引导,Angular将开始解析DOM,寻找指令。如果您有一个应用程序实例(并且确实如此),您的控制器将自动添加到该实例中。如果您查看auto-bootstrap文档 - &gt;自动初始化,您将找到以下内容:
Angular会在DOMContentLoaded事件或自动时自动初始化 如果当时是document.readyState,则会计算angular.js脚本 已设置为“完成”。此时Angular会查找ng-app 指定应用程序根目录的指令。如果ng-app 找到指令,然后Angular将:
- 加载与指令关联的模块。
- 创建应用程序
- inject编译DOM,将ng-app指令作为根目录 汇编。这允许你告诉它只处理一部分 DOM作为Angular应用程序。
这个实际上是烟雾和镜子,真的不应该算:)。如果您查看JSFiddle的网络流量,您会发现AngularJS实际上正在加载。因此,插值实际上会自动绑定到 JSFiddle Angular实例,而不是您自己提供的实例(或者在这种情况下没有提供),解析,然后作为2
呈现在DOM中。
答案 1 :(得分:1)
Per angularjs.org:
“ngApp指令指定应用程序的根元素,通常放在页面的根元素附近 - 例如在或标记上。”
换句话说,ng-app
是使您的html成为Angular应用程序的原因,因此能够在您的代码中使用{{ }}
。这些括号能够执行操作,这就是您能够计算1 + 1的原因。但是,如果您要使用变量,则需要将ng-controller
附加到容器div并初始化Controller
答案 2 :(得分:1)
相当于ng-app=""
。但是,您需要一个名称空间来附加控制器,指令。等等。 Angular可以在没有命名空间的情况下插入{{ 1 + 1 }}
,但是您无法将任何内容绑定到视图范围。有趣的是,ng-app=" "
是您可以绑定的命名空间。