描述
开 本: 32开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787302460749
AngularJS属于Web前端开发技术,本书涉及AngularJS与后端服务交互相关的知识点。对于Web前端开发人员来说,JavaScript语言肯定不陌生,而Node.js使得JavaScript语言能够在操作系统环境下运行。笔者是一名全栈开发工程师,本打算使用Java EE技术发布Web服务,考虑到本书面向的读者主要为Web前端开发人员,为了避免Web服务部署困难,所以*终选择使用Node.js开发服务端接口。另外,本书也介绍了一些基于Node.js的Web前端开发工具,希望能够帮助大家提高日常开发效率。
本书分为两个部分,*部分为入门篇,从第1~14章,主要介绍AngularJS开发环境搭建、数据绑定、指令及路由等基本知识点,每个知识点都会有一个完整的案例与之对应;第15~19章为本书的第二部分,即进阶篇,主要介绍一些常用的AngularJS第三方精华扩展,以及目前主流的Web前端工具,包括包管理工具Npm和Bower、前端流式自动化工具Gulp及前端单元测试工具Jasmine&Karma。在*后两章中,我们综合运用前面所学的知识,实现了一个AngularJS版本的扫雷游戏和一个客户管理系统。
本书既适合Web前端开发初学者、Web前端开发工程师阅读,也适合作为高等院校和培训学校相关专业的教材。
目 录
部分 入门篇
第1章 走进AngularJS世界 3
1.1
AngularJS简介 3
1.2 搭建AngularJS开发环境 3
1.2.1
选择集成开发工具 3
1.2.2
下载与安装AngularJS 6
1.2.3
代码调试工具 7
1.3 个AngularJS应用 8
1.4
AngularJS应用剖析 9
1.4.1
个AngularJS应用解惑 9
1.4.2
AngularJS应用构成元素 10
1.4.3
AngularJS表达式 10
1.5 本章小结 12
第2章 双向数据绑定 13
2.1
AngularJS双向数据绑定 13
2.2
ng-model指令 14
2.3
ng-bind指令 16
2.4 数据绑定实例:价格计算器
17
2.5 本章小结 18
第3章 AngularJS与MVC 19
3.1
MVC模式简介 19
3.2
AngularJS中的MVC 20
3.2.1
AngularJS控制器的定义 20
3.2.2
控制器对象的实例化 21
3.3 使用MVC思想重构价格计算器程序
22
3.4 控制器的作用域范围 23
3.5 控制器中处理DOM事件 25
3.6 本章小结 27
第4章 应用模块化 28
4.1 应用模块划分的重要性 28
4.2
AngularJS中的模块 28
4.2.1
AngularJS模块的定义 29
4.2.2
使用模块解决命名冲突问题 29
4.3 模块化实践 32
4.4 本章小结 33
第5章 作用域与事件 34
5.1
AngularJS作用域详解 34
5.2
AngularJS作用域继承 36
5.2.1
JavaScript对象继承机制 36
5.2.2
AngularJS作用域对象原型继承 39
5.3 作用域高级特性 42
5.3.1
$watch方法监视作用域 42
5.3.2
作用域监视解除 45
5.3.3
$apply方法与$digest循环 46
5.3.4
$apply与$digest应用实战 47
5.3.5
$timeout与$interval服务介绍 49
5.4 作用域事件路由与广播 50
5.4.1
$emit方法实现事件路由 50
5.4.2
$broadcast方法实现事件广播 52
5.4.3
作用域对象$on方法详解 55
5.5 本章小结 55
第6章 路由与多视图 56
6.1 创建多视图应用 56
6.1.1
使用$routeProvider创建映射 56
6.1.2
创建多视图 58
6.1.3
通过路由切换视图 58
6.2 通过URL向控制器传递参数 60
6.3
ng-template指令的使用 62
6.4
$location服务 64
6.5
$location实现多视图切换 66
6.6 路由事件 67
6.7
ng-include指令 68
6.8
UI Router框架使用 69
6.8.1
UI Router下载与安装 69
6.8.2
UI Router使用案例 70
6.9 本章小结 73
第7章 AngularJS表单校验 74
7.1
Web前端表单校验的必要性 74
7.2
AngularJS表单校验模式 74
7.3
ngMessages模块 79
7.4 本章小结 82
第8章 AngularJS指令 83
8.1 内置指令详解 83
8.2
AngularJS自定义指令 86
8.3 指令定义对象详解 88
8.3.1
link方法 88
8.3.2
compile方法 92
8.3.3
scope属性与指令作用域 94
8.3.4
孤立作用域与父作用域模型数据绑定 95
8.3.5
Transclusion 100
8.3.6
controller方法与require属性 104
8.4 自定义表单验证模式 107
8.5 本章小结 109
第9章 Service、Factory与Provider 110
9.1
Service 110
9.2
Factory 112
9.3
Provider 113
9.4
Value&Constant 114
9.5 本章小结 115
第10章 AngularJS过滤器 116
10.1
过滤器使用方法 116
10.2
AngularJS内置过滤器 118
10.3
自定义过滤器 126
10.3.1
案例一:自定义金额转换人民币大写过滤器 127
10.3.2
案例二:自定义带参数的过滤器 129
10.4
第三方过滤器库的使用 131
10.4.1
angular-filter 131
10.4.2
angular-emoji-filter 133
10.5
本章小结 134
第11章 AngularJS中的依赖注入 135
11.1
JavaScript依赖注入实现 138
11.2
AngularJS中的依赖注入 142
11.3
$provide服务介绍 143
11.4
$injector服务介绍 145
11.5
本章小结 146
第12章 AngularJS与动画 147
12.1
Web动画实现原理 147
12.2
使用CSS3实现动画 150
12.2.1
CSS3中的Transform属性 150
12.2.2
CSS3中的Transition属性 153
12.2.3
CSS3中的Animation属性 157
12.2.4
常用的CSS3动画库 160
12.3
AngularJS动画 162
12.3.1
基于事件驱动的CSS3动画 162
12.3.2
AngularJS中的JavaScript动画 166
12.3.3
ngView视图切换动画案例 168
12.3.4
ngAnimate与CSS3动画库整合 172
12.3.5
ngFx动画扩展库 175
12.4
本章小结 177
第13章 Cookie读写 178
13.1
Cookie简介 178
13.2
在JavaScript中操作Cookie 179
13.3
在AngularJS中操作Cookie 183
13.4
本章小结 186
第14章 Promise 187
14.1
AngularJS中的Promise机制 188
14.2
AngularJS请求Web服务 190
14.2.1
$http服务 191
14.2.2
使用Express构建RESTful服务 194
14.2.3
$resource服务 197
14.3
AngularJS文件上传 200
14.4
Angular File Upload模块介绍 204
14.5
本章小结 207
第二部分 进阶篇
第15章 AngularUI 211
15.1
UI Bootstrap 211
15.1.1
警告框案例 212
15.1.2
复选框案例 213
15.1.3
日历控件案例 215
15.1.4
模态对话框案例 216
15.1.5
下拉菜单案例 220
15.2
UI Ace 222
15.3
UI Grid 227
15.4
UI Date 229
15.5
UI Select 232
15.6
本章小结 234
第16章 AngularJS精华扩展 235
16.1
利用Angular Chart生成图表 235
16.1.1
柱状图案例 236
16.1.2
曲线图案例 237
16.1.3
饼状图案例 239
16.2
利用Videogular实现播放器 241
16.3
利用Angular Masonry实现照片墙 246
16.4
利用ngDialog实现对话框 250
16.5
本章小结 253
第17章 常用Web前端工具集 254
17.1
Node.js安装与使用 254
17.2
Npm包管理工具 257
17.2.1
Npm安装 257
17.2.2
初始化项目 258
17.2.3
安装Node模块 259
17.2.4
卸载Node模块 260
17.3
Bower管理工具 260
17.3.1
安装Bower 261
17.3.2
初始化Bower 261
17.3.3
使用Bower安装包 263
17.3.4
查看包的信息 263
17.3.5
更新包的版本 264
17.3.6
查找包 264
17.3.7
卸载包 264
17.4
Gulp项目管理工具 265
17.4.1
Gulp的安装与使用 265
17.4.2
利用JSHint验证JavaScript代码 266
17.4.3
压缩JavaScript代码 268
17.4.4
使用Gulp Changed插件更新文件 270
17.4.5
使用Gulp Plumber插件处理异常 271
17.4.6
使用Gulp压缩图片 271
17.4.7
使用Gulp编译Less 272
17.4.8
使用Gulp Browsersync插件进行调试 275
17.5
Jasmine&Karma单元测试工具 277
17.5.1
安装Jasmine 278
17.5.2
使用Jasmine进行单元测试 278
17.5.3
在浏览器环境下使用Jasmine 282
17.5.4
安装并使用karma 284
17.5.5
整合Jasmine&Karma 286
17.5.6
AngularJS单元测试 288
17.6
本章小结 294
第18章 综合案例:扫雷游戏 295
18.1
搭建开发环境 295
18.2
游戏元素介绍 296
18.3
实现布雷区 297
18.4
随机生成 300
18.5
生成方格中的数字 303
18.6
响应右击事件 308
18.7 游戏胜利与失败条件检测 311
18.8
实现重新开始游戏功能 313
18.9
自动翻开相邻方格 314
18.10
本章小结 317
第19章 综合案例:客户管理系统
318
19.1
项目整体介绍 318
19.2
实现用户模块 321
19.3
实现主面板模块 326
19.4
实现报表模块 328
19.5
实现客户信息管理模块 331
19.6
本章小结 335
AngularJS是Google公司开发的一款Web前端框架,其源码目前托管在Github上,从其源码的关注度就可以看出AngularJS框架的火热程度。AngularJS提供了一些优秀的特性,例如双向数据绑定、MVC架构模式、指令等,能够在很大程度上降低Web前端开发的难度,因此深受广大Web前端开发人员的喜爱。AngularJS框架功能虽然强大,但是对于初学者来说入门比较困难,主要是因为AngularJS有别于传统的Web前端框架,指令、路由、服务等概念都是其他前端框架所不具备的。纵观AngularJS图书市场,英文图书居多,而中文图书则以翻译为主,缺少一本真正适合初学者入门的书籍。笔者曾担任CSDN特邀编辑参与AngularJS知识库构建,对AngularJS框架有较深入研究,正巧受清华大学出版社编辑夏毓彦的邀请,希望出版一本AngularJS图书,因而促成了本书的出版。学习技术的目的通常是希望能够快速用在项目实战中。在选择IT图书时,通常希望以实用为主,专业术语堆砌的书籍容易造成理解困难,所以表述通俗、案例简单且能说明问题的书籍往往受到大家的青睐。本书正好符合这种风格,尽量避免过多的专业术语,每个知识点都附加一个完整的案例,读者可以根据代码结合案例运行效果进行学习。虽然AngularJS属于Web前端开发技术,但是本书也涉及AngularJS与后端服务交互相关的知识点。对于Web前端开发人员来说,JavaScript语言肯定不陌生,而Node.js使得JavaScript语言能够在操作系统环境下运行。笔者是一名全栈开发工程师,本打算使用Java EE技术发布Web服务,考虑到本书面向的读者主要为Web前端开发人员,为了避免Web服务部署困难,所以终选择使用Node.js开发服务端接口。另外,本书也介绍了一些基于Node.js的Web前端开发工具,希望能够帮助大家提高日常开发效率。需要注意的是,本书使用Brackets作为代码编辑器,使用Chrome浏览器作为代码运行与调试工具,读者需要安装这两款工具,然后可以从本书指定的Github勘误页面中获取本书的所有源代码。每个章节源码均放在对应的目录中,例如ch01目录中为第1章所有源码。读者可以将本书所有源码导入Brackets工作空间中,然后通过Brackets编辑器的实时预览工具运行本书的案例代码。另外,本书从开始写作到完稿总共用了5个月时间,由于个人水平有限,书中难免有一些疏漏,特提供了勘误页面,地址如下:https://github.com/rongbo-j/angular-book读者可以在上面的地址中下载随书源码并反馈本书中存在的错误,如有其他AngularJS相关疑问,也可以在该页面进行交流,共同提高!读者也可通过博客或者邮件与笔者进行技术交流。博客:http://blog.csdn.net/rongbo_j邮箱:[email protected]
后,感谢清华大学出版社的编辑们,没有你们的帮助,就不会有本书的出版。另外,还要感谢我的家人及同事,你们的支持是我写作的动力!
编 者2017年1月
图2.1 AngularJS双向数据绑定图解 ng-model指令为了建立数据绑定,我们需要用到AngularJS另外一个内置指令ng-model,该指令只能用在表单元素上,使用方法如下:
在input输入框上添加ng-model指令后,AngularJS框架就会在对应的作用域中创建一个uname属性和该输入框进行绑定。数据绑定是AngularJS秀的特性之一,下面以一个案例来说明AngularJS数据绑定机制的好处。假如我们要完成这样一个功能,即把用户在表单中输入的信息动态回显到页面中。如果使用原生的JavaScript,可以通过document对象的getElementById()方法获取输入框对象,响应输入框的keyup事件,在输入框的keyup事件响应方法中获取输入框内容,然后同样以操作DOM的方式把输入框内容显示到页面中,具体代码如下:代码清单:ch02ch02_01.html
var uname = document.getElementById(”uname”); var info = document.getElementById(”info”); uname.onkeyup = function(){ info.innerHTML = uname.value; }
上面的代码非常简单,相信读者都能看懂,接下来在浏览器中运行ch02_01.html页面,效果如图2.2所示。
图2.2 动态回显用户输入示例可以看到界面上显示的内容随着输入的改变而动态改变。本例中我们编写了数行JavaScript代码,为了突出AngularJS数据绑定机制的优势,我们再使用AngularJS数据绑定机制来完成这个案例,具体代码如下:代码清单:ch02ch02_02.html
在浏览器中运行ch02_02.html页面,就会发现运行效果和上一个案例完全相同,但是本案例中的核心代码仅仅只有下面两行:
如上面的代码所示,我们甚至连一行JavaScript代码都没有编写就完成了这个功能,到底是怎样做到的呢?下面对该应用进行剖析:上面案例中的ng-app指令用于启动AngularJS应用。需要注意的一点是,当AngularJS遇到ng-app指令时就会创建一个名为$rootSocpe的作用域,该作用域为AngularJS应用的根作用域。作用域其实是一个简单的JavaScript对象,形式如下: var $rootScope={uname:”江荣波”};
我们把ng-model指令作为属性添加到input标签中,此时AngularJS会在$rootSocpe作用域中添加一个uname属性和input输入框绑定,当我们在input表单中输入内容时,AngularJS会自动把输入的内容同步到作用域的uname属性中,因此我们不需要自己响应input标签的keyup事件去处理。{{uname}}为AngularJS的表达式形式,可以访问AngularJS作用域里的属性,这里我们使用表达式把uname属性输出到页面中。同时AngularJS还能够监视作用域中数据的变化,当数据发生变化时,页面显示内容也能够得到实时更新。在上面的例子中,我们向$rootScope作用域中添加属性进行了数据绑定,会造成全局作用域污染,实际项目中并不会这么做,而是把表单和控制器作用域中的属性进行数据绑定。控制器作用域是根作用域$rootScope的子作用域,后面会接触到。 ng-bind指令ng-bind指令是和数据绑定相关的另一个指令,其作用是实现作用域到视图的单向数据绑定,和表达式功能类似,可用于向界面中输出作用域中的数据,例如2.2节案例中输出uname属性的表达式:
可以替换为:
或者
不同的是,在使用AngularJS表达式{{name}}时,如果遇到网络问题,就会导致AngularJS加载缓慢,我们会看到浏览器直接把AngularJS表达式当作字符串渲染到页面中,这样用户体验将不是很好,所以推荐使用ng-bind指令。ng-bind指令在AngularJS没有加载完毕的时候是不会解析执行的,只有AngularJS加载完毕才会执行。window.alert()方法会中断JavaScript代码的执行,可以通过alert()方法模拟网络加载延迟的情况,例如:代码清单:ch02ch02_04.html
alert(”pause”);
我们可以在浏览器中运行ch02_04.html页面(见图2.3),未经过AngularJS框架解析的表达式内容直接输出到了页面中。
图2.3 AngularJS表达式作为字符串渲染到页面示例相比之下,使用ng-bind指令则不会出现这种现象,但是当我们需要进行运算处理或者使用过滤器对输出内容进行处理时,则必须使用表达式。 数据绑定实例:价格计算器前面几节我们学习了AngularJS数据绑定的相关知识,本节我们使用这些知识来实现一个简单的价格计算器程序,完整代码如下:代码清单:ch02ch02_06.html
如上面的代码所示,首先使用ng-app指令启动AngularJS框架,接着使用ng-init指令在作用域对象中添加两个属性price和num,指定初始值为10和1,然后使用ng-model指令把price、num两个属性和表单元素进行数据绑定,后我们使用表达式输出price和num的乘积。
在浏览器中运行ch02_06.html,可以看到“单价”输入框和“数量”输入框中的数据默认为10、1,说明作用域中的数据修改能够自动同步到视图中;修改单价输入框和数量输入框的内容分别为100、5,界面中输出总价为500(见图2.4),说明在视图中输入的数据也能够自动同步到作用域中,这便是AngularJS的双向数据绑定机制。
图2.4 价格计算器程序 本章小结数据绑定是AngularJS秀的特性之一,也是AngularJS基础的知识点,本章详细地介绍了什么是AngularJS双向数据绑定及与数据绑定相关的两个指令ng-model和ng-bind的使用,并在后使用AngularJS数据绑定相关知识完成了一个简单的价格计算器程序。相信读者通过本章的学习,已经理解了数据绑定的精髓。下一章我们开始学习AngularJS的MVC设计思想,然后以MVC思想重构本章的价格计算器程序。
评论
还没有评论。