这一节稍微复杂 angularjs 是用MVC 模式,git bush 到angular-phonecat文件夹,输入以下代码,将这一节的示例代码git出来
git checkout -f step-2打开
app/index.html
:
可以看到如下代码
<html ng-app="phonecatApp"> <head> ... <script src="bower_components/angular/angular.js"></script> <script src="js/controllers.js"></script> </head> <body ng-controller="PhoneListCtrl"> <ul> <li ng-repeat="phone in phones"> <span>{{phone.name}}</span> <p>{{phone.snippet}}</p> </li> </ul> </body> </html>
可以看到之前的硬编码被一个angular指令ngRepeat和两个表达式替代了
在 <li> 元素中的ng-repeat 属性是一个angular 循环指令,phones 代表一个list或者一个array,phone 代表其中的一个item.
{{phone.name}} 是一个表达式,这里相当于phone所代表的item中的name属性的值
我们在body 元素中添加了一个新的指令ng-congroller,并将其关联到了PhoneListCtrl id上,表示一个id为PhoneListCtrl 的controller。
{{phone.name}}表达式所使用的module便是在这个controller中构建的。
注意,我用用ng-app="phonecatApp"指定了一个angular module,phonecatApp是这个module的name,并且 在这个module中有一个名为PhoneListCtrl 的controller
数据模型(model)在控制器PhoneListCtrl
controller.中进行实例化
打开app/controllers.js,可以看到初始化代码
var phonecatApp = angular.module('phonecatApp', []); // 创建module
//初始化数据模型 phonecatApp.controller('PhoneListCtrl', function ($scope) { $scope.phones = [ {'name': 'Nexus S', 'snippet': 'Fast just got faster with Nexus S.'}, {'name': 'Motorola XOOM™ with Wi-Fi', 'snippet': 'The Next, Next Generation tablet.'}, {'name': 'MOTOROLA XOOM™', 'snippet': 'The Next, Next Generation tablet.'} ]; });
scope讲解
在html 元素中的ng-app 指令定义了一个module ,拥有root作用域,controller 继承了module的作用域,并拥有自己的子作用域,并且在自己的作用域中提供上下文。表达式在controller中,可以直接使用controller作用域中的变量。