一个应用的代码架构有很多种。对于AngularJS应用,我们鼓励使用模型-视图-控制器(MVC)模式解耦代码和分离关注点。考虑到这一点,我们用AngularJS来为我们的应用添加一些模型、视图和控制器。

请重置工作目录:

git checkout -f step-2

我们的应用现在有了一个包含三部手机的列表。

步骤1和步骤2之间最重要的不同在下面列出。,你可以到GitHub去看完整的差别。

视图和模板

在AngularJS中,一个视图是模型通过HTML**模板**渲染之后的映射。这意味着,不论模型什么时候发生变化,AngularJS会实时更新结合点,随之更新视图。

比如,视图组件被AngularJS用下面这个模板构建出来:

<html ng-app> <head> ... <script src="lib/angular/angular.js"></script> <script src="js/controllers.js"></script> </head> <body ng-controller="PhoneListCtrl"> <ul> <li ng-repeat="phone in phones"> {{phone.name}} <p>{{phone.snippet}}</p> </li> </ul> </body> </html>

我们刚刚把静态编码的手机列表替换掉了,因为这里我们使用ngRepeat指令和两个用花括号包裹起来的AngularJS表达式——{{phone.name}}{{phone.snippet}}——能达到同样的效果。

  • <li>标签里面的ng-repeat="phone in phones"语句是一个AngularJS迭代器。这个迭代器告诉AngularJS用第一个<li>标签作为模板为列表中的每一部手机创建一个<li>元素。
  • 正如我们在第0步时学到的,包裹在phone.namephone.snippet周围的花括号标识着数据绑定。和常量计算不同的是,这里的表达式实际上是我们应用的一个数据模型引用,这些我们在PhoneListCtrl控制器里面都设置好了。

模型和控制器

PhoneListCtrl控制器里面初始化了数据模型(这里只不过是一个包含了数组的函数,数组中存储的对象是手机数据列表):

app/js/controller.js:

function PhoneListCtrl($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."} ]; }

尽管控制器看起来并没有起到什么控制的作用,但是它在这里起到了至关重要的作用。通过给定我们数据模型的语境,控制器允许我们建立模型和视图之间的数据绑定。我们是这样把表现层,数据和逻辑部件联系在一起的:

  • PhoneListCtrl——控制器方法的名字(在JS文件controllers.js中)和<body>标签里面的ngController指令的值相匹配。
  • 手机的数据此时与注入到我们控制器函数的作用域$scope)相关联。当应用启动之后,会有一个根作用域被创建出来,而控制器的作用域是根作用域的一个典型后继。这个控制器的作用域对所有<body ng-controller="PhoneListCtrl">标记内部的数据绑定有效。

AngularJS的作用域理论非常重要:一个作用域可以视作模板、模型和控制器协同工作的粘接器。AngularJS使用作用域,同时还有模板中的信息,数据模型和控制器。这些可以帮助模型和视图分离,但是他们两者确实是同步的!任何对于模型的更改都会即时反映在视图上;任何在视图上的更改都会被立刻体现在模型中。

想要更加深入理解AngularJS的作用域,请参看AngularJS作用域文档。

测试

“AngularJS方式”让开发时代码测试变得十分简单。让我们来瞅一眼下面这个为控制器新添加的单元测试:

test/unit/controllersSpec.js:

describe('PhoneCat controllers', function() { describe('PhoneListCtrl', function(){ it('should create "phones" model with 3 phones', function() { var scope = {}, ctrl = new PhoneListCtrl(scope); expect(scope.phones.length).toBe(3); }); }); });

这个测试验证了我们的手机数组里面有三条记录(暂时无需弄明白这个测试脚本)。这个例子显示出为AngularJS的代码创建一个单元测试是多么的容易。正因为测试在软件开发中是必不可少的环节,所以我们使得在AngularJS可以轻易地构建测试,来鼓励开发者多写它们。

在写测试的时候,AngularJS的开发者倾向于使用Jasmine行为驱动开发(BBD)框架中的语法。尽管AngularJS没有强迫你使用Jasmine,但是我们在教程里面所有的测试都使用Jasmine编写。你可以在Jasmine的官方主页或者Jasmine Wiki上获得相关知识。

基于AngularJS的项目被预先配置为使用JsTestDriver来运行单元测试。你可以像下面这样运行测试:

  1. 在一个单独的终端上,进入到angular-phonecat目录并且运行./scripts/test-server.sh来启动测试(Windows命令行下请输入.\scripts\test-server.bat来运行脚本,后面脚本命令运行方式类似);
  2. 打开一个新的浏览器窗口,并且转到http://localhost:9876 ;
  3. 选择“Capture this browser in strict mode”。

    这个时候,你可以抛开你的窗口不管然后把这事忘了。JsTestDriver会自己把测试跑完并且把结果输出在你的终端里。

  4. 运行./scripts/test.sh进行测试 。

    你应当看到类似于如下的结果:

    Chrome: Runner reset. . Total 1 tests (Passed: 1; Fails: 0; Errors: 0) (2.00 ms) Chrome 19.0.1084.36 Mac OS: Run 1 tests (Passed: 1; Fails: 0; Errors 0) (2.00 ms)

转载于:https://www.cnblogs.com/hsha/p/4709501.html

AngularJS 模板相关推荐

  1. iangularjs 模板,AngularJS模板中的三元运算符

    How do you do a ternary with AngularJS (in the templates)? It would be nice to use some in html attr ...

  2. html三元运算符 模板,AngularJS模板中的三元运算符

    小编典典 更新 :Angular1.1.5添加了一个三元运算符,因此现在我们可以简单地编写 如果您使用的是较早版本的Angular,则有两个选择: (condition && resu ...

  3. iangularjs 模板_AngularJS 模板(Templates)

    AngularJS 模板(Templates) Angular的模板是一个声明式的视图,它指定信息从模型.控制器变成用户在浏览器上可以看见的视图. 它把一个静态的DOM -- 只包含HTML,CSS以 ...

  4. SegmentFault 技术周刊 Vol.17 - 听说你还没用上 AngularJS

    如何在网页上构建动态应用,通常的解决方案是使用类库和框架,来弥补原生 JS 和 HTML 的不足,实现具体的应用逻辑,如典型的 jQuery.knockout.js 等.而 Google 则直接尝试从 ...

  5. 如果我有jQuery背景,那么“ AngularJS中的思考”吗? [关闭]

    已关闭 . 这个问题需要更加集中 . 它当前不接受答案. 想改善这个问题吗? 更新问题,使其仅通过编辑此帖子来关注一个问题. 4年前关闭. 已锁定 . 该问题及其答案被锁定,因为该问题是题外话,但具有 ...

  6. 【Java Web前端开发】前端框架 bootstrap+jquery+angularjs探索

    文章目录 1 Bootstrap 2 jQuery 3 AngularJS 1 Bootstrap 在Bootstrap的官网介绍中,Bootstrap is the most popular HTM ...

  7. AngularJS优缺点、使用场景

    AngularJS 优缺点 优点: AngularJS模板功能强大丰富,自带了极其丰富的angular指令. AngularJS是完全可扩展的,与其他库的兼容效果很好,每一个功能可以修改或更换,以满足 ...

  8. 红帽 jboss_红帽JBoss BRMS和BPMS富客户端框架展示了与GWT / Errai / UberFire和AngularJS的多语言集成...

    红帽 jboss 上周,我发布了一个博客,重点介绍了我的演示文稿,该演示文稿展示了我们在BRMS和BPMS平台内完成的工作,Drools和jBPM项目的产品化版本所产生的丰富客户端平台. 该演示文稿是 ...

  9. 红帽JBoss BRMS和BPMS富客户端框架展示了与GWT / Errai / UberFire和AngularJS的多语言集成...

    上周,我发布了一个博客,重点介绍了我的演示文稿,该演示文稿展示了我们在BRMS和BPMS平台内完成的工作,Drools和jBPM项目的产品化版本所产生的丰富客户端平台. 该演示文稿是所有屏幕截图和视频 ...

  10. AngularJS中文入门教程

    AngularJS入门教程00:引导程序  4517 angularjs   03-29 14:14   01-07 17:25   15  AngularJS AngularJS 入门教程 Angu ...

最新文章

  1. 如何检查jQuery中是否已选中复选框?
  2. 彻底搞懂JavaScript执行机制
  3. centos 没有nmtui命令_Linux free 命令
  4. 王道计算机网络 传输层整理 超详细版
  5. 各种网络模拟器的下载链接
  6. ExpandableListActivity列表嵌套列表
  7. linux上创建RAID(磁盘阵列)与LVM(逻辑盘)
  8. Telnet命令在Linux / Unix中的用法
  9. Centos7搭建虚拟用户FTP
  10. React Native 生成 released apk图片不显示
  11. 程序员修炼之道-第二版
  12. 001 - TOTP 和 Google 身份验证器
  13. 以太网性能测试仪-Y.1564测试
  14. 乔布斯人物介绍PPT模板
  15. 使用Dir函数遍历文件和目录
  16. 天才啊!仅用四个整数编写一个贪吃蛇游戏!
  17. Python3网络爬虫:腾讯新闻App的广告数据抓取
  18. CenterNet做2D和3D目标检测
  19. android百度地图行政区填充颜色
  20. 微信公众平台消息体加解密实现

热门文章

  1. InnoDB中Adaptive hash index存在问题、Percona改进及一个bug
  2. Activiti流程定义部署、删除
  3. C++Primer 学习笔记之关联容器
  4. 关于在数据库中存储层次数据的一点看法与理解
  5. 使用spring cloud,nacos,dubbo,gateway搭建微服务
  6. 用python写个小游戏难吗_小伙用Python制做一个小游戏,结果6秒就结束,怎么难玩?...
  7. nginx中的共享内存的3种方式
  8. 现实竞争激烈,学透才能在职场做个风云人物,单片机存储器篇
  9. 【渝粤教育】国家开放大学2018年春季 3924T★汽车电器设备构造与检修 参考试题
  10. 【渝粤题库】广东开放大学 管理会计 形成性考核