第1部分 准备 2
第1章 准备 2
1.1 你需要知道哪些知识 2
1.2 本书的组织结构 2
1.3 会有许多实例吗 3
1.4 从哪里可以获得实例代码 6
1.5 如何搭建你的开发环境 6
1.5.1 选择Web浏览器 7
1.5.2 选择代码编辑器 7
1.5.3 安装Node.js 8
1.5.4 安装Web服务器 8
1.5.5 安装测试系统 9
1.5.6 创建AngularJS文件夹 9
1.5.7 执行一个简单的测试 11
1.6 小结 13
第2章 你的第一个AngularJS应用 14
2.1 准备项目 14
2.2 使用AngularJS 16
2.2.1 将AngularJS应用到HTML文件 16
2.2.2 创建数据模型 18
2.2.3 创建控制器 20
2.2.4 创建视图 22
2.3 基本功能之外 25
2.3.1 使用双向模型绑定 25
2.3.2 创建和使用控制器行为 27
2.3.3 使用依赖于其他行为的行为 29
2.3.4 响应用户交互 32
2.3.5 对模型数据过滤和排序 35
2.3.6 通过Ajax获取数据 38
2.4 小结 41
第3章 结合背景理解AngularJS 42
3.1 理解AngularJS的擅长之处 42
3.2 理解MVC模式 44
3.2.1 理解模型 46
3.2.2 理解控制器 47
3.2.3 理解视图数据 48
3.2.4 理解视图 48
3.3 理解RESTful服务 48
3.4 常见的设计陷阱 50
3.4.1 将逻辑放到错误的地方 50
3.4.2 采用数据存储所依赖的数据格式 51
3.4.3 墨守成规 51
3.5 小结 52
第4章 HTML和Bootstrap CSS入门 53
4.1 了解HTML 53
4.1.1 了解HTML元素的解析结构 54
4.1.2 了解属性 55
4.1.3 了解元素内容 56
4.1.4 了解空元素 56
4.1.5 了解文档结构 57
4.2 了解Bootstrap 58
4.2.1 使用基本的Bootstrap类 60
4.2.2 用Bootstrap对表格使用样式 61
4.2.3 使用Bootstrap创建表单 64
4.2.4 使用Bootstrap创建网格 67
4.3 小结 71
第5章 JavaScript基础 72
5.1 准备示例项目 73
5.2 理解script元素 73
5.3 使用语句 74
5.4 定义并使用函数 75
5.4.1 定义带参函数 76
5.4.2 定义返回结果的函数 77
5.4.3 检查函数 78
5.5 使用变量及类型 79
5.5.1 使用基本类型 80
5.5.2 创建对象 82
5.5.3 使用对象 86
5.6 使用JavaScript运算符 91
5.6.1 使用条件语句 92
5.6.2 对比等于运算符和全等运算符 93
5.6.3 显式转换类型 96
5.7 使用数组 98
5.7.1 使用数组字面量 99
5.7.2 检测数组 100
5.7.3 读取和修改数组的内容 100
5.7.4 枚举数组内容 101
5.7.5 使用内置数组方法 102
5.8 比较undefined和null值 103
5.9 使用承诺 106
5.10 使用JSON 111
5.11 小结 112
第6章 真正的应用程序:运动商店 113
6.1 开始 114
6.1.1 准备数据 114
6.1.2 准备应用程序 117
6.2 显示(伪造的)产品数据 120
6.2.1 创建控制器 120
6.2.2 显示产品详情 122
6.3 显示分类列表 125
6.3.1 创建分类列表 125
6.3.2 生成分类导航链接 126
6.3.3 选择分类 129
6.3.4 高亮选择的分类 132
6.3.5 添加分页 134
6.4 小结 138
第7章 运动商店:导航和结账 140
7.1 准备实例项目 140
7.2 使用真实项目数据 140
7.3 创建局部视图 144
7.4 创建购物车 146
7.4.1 定义购物车模块和服务 146
7.4.2 创建购物车部件 148
7.4.3 添加产品选择按钮 151
7.5 添加URL导航 154
7.5.1 定义URL路由 154
7.5.2 使用URL路由导航 156
7.6 开始结账流程 158
7.7 小结 161
第8章 运动商店:订单和管理 162
8.1 准备示例程序 162
8.2 获取运输详情 162
8.2.1 添加表单验证 164
8.2.2 添加剩下的表单字段 168
8.3 下单 170
8.3.1 扩展Deployd服务 170
8.3.2 定义控制器行为 172
8.3.3 调用控制器行为 173
8.3.4 定义视图 173
8.4 改进 174
8.5 管理产品类别 175
8.5.1 准备Deployd 175
8.5.2 创建管理应用程序 177
8.5.3 实现验证 178
8.5.4 定义主视图和控制器 181
8.5.5 实现订单特性 183
8.5.6 实现产品特性 185
8.6 小结 190
第2部分 使用Angular JS工作 194
第9章 AngularJS应用剖析 194
9.1 准备示例项目 195
9.2 使用模块工作 196
9.3 使用模块定义AngularJS组件 197
9.3.1 定义控制器 198
9.3.2 定义指令 204
9.3.3 定义过滤器 207
9.3.4 定义服务 210
9.4 使用模块组织代码 213
9.5 小结 218
第10章 使用绑定和模板指令 219
10.1 为什么以及何时使用指令 220
10.2 准备示例项目 220
10.3 使用数据绑定指令 221
10.3.1 执行和禁止单向绑定 223
10.3.2 创建双向数据绑定 225
10.4 使用模板指令 227
10.4.1 重复生成元素 228
10.4.2 重复生成多个顶层元素 234
10.4.3 使用局部视图工作 235
10.4.4 将ng-include指令用作属性 239
10.4.5 有条件地交换元素 240
10.4.6 隐藏未处理的内联模板绑定表达式 244
10.5 小结 246
第11章 使用元素与事件指令 247
11.1 准备示例项目 247
11.2 使用元素指令 248
11.2.1 显示、隐藏和移除元素 249
11.2.2 管理类与CSS 254
11.3 处理事件 258
11.4 管理特殊属性 263
11.4.1 管理布尔属性 263
11.4.2 管理其他属性 265
11.5 小结 266
第12章 使用表单 267
12.1 准备示例项目 267
12.2 对表单元素使用双向数据绑定 269
12.2.1 隐式地创建模型属性 270
12.2.2 检查所创建的数据模型对象 274
12.3 校验表单 274
12.4 提供表单校验反馈信息 280
12.4.1 使用CSS提供校验反馈信息 281
12.4.2 使用特殊变量来提供反馈信息 284
12.4.3 延迟校验反馈 288
12.5 使用表单指令属性 290
12.5.1 使用input元素 290
12.5.2 使用文本区 293
12.5.3 使用选择列表 294
12.6 小结 298
第13章 使用控制器和作用域 299
13.1 为什么以及何时使用控制器和作用域 299
13.2 准备示例项目 300
13.3 理解基本原理 301
13.3.1 创建和使用控制器 301
13.3.2 设置作用域 302
13.3.3 修改作用域 304
13.4 组织控制器 305
13.4.1 使用一个单块控制器 306
13.4.2 复用控制器 308
13.4.3 使用控制器继承 313
13.4.4 使用多控制器 320
13.5 使用无作用域的控制器 322
13.6 显式地更新作用域 324
13.6.1 设置jQuery UI 324
13.6.2 控制按钮状态 326
13.6.3 对按钮单击进行计数 327
13.7 小结 328
第14章 使用过滤器 329
14.1 为什么以及何时使用过滤器 329
14.2 准备示例项目 330
14.3 过滤单个数据的值 332
14.3.1 格式化货币值 332
14.3.2 格式化其他数字值 334
14.3.3 格式化日期 335
14.3.4 改变字符串大小写 337
14.3.5 生成JSON 338
14.3.6 本地化过滤器输出 338
14.4 过滤集合 341
14.4.1 限制项目数量 341
14.4.2 选取项 345
14.4.3 对项目排序 347
14.5 链式过滤器 350
14.6 创建自定义过滤器 351
14.6.1 创建格式化数据值的过滤器 351
14.6.2 创建一个集合过滤器 353
14.6.3 在已有的过滤器上搭建新的过滤器 355
14.7 小结 356
第15章 创建自定义指令 357
15.1 为什么以及何时创建自定义指令 357
15.2 准备示例项目 358
15.3 创建自定义指令 359
15.3.1 定义指令 359
15.3.2 实现链接函数 360
15.3.3 打破对数据属性的依赖 363
15.3.4 处理数据变化 366
15.4 使用jqLite工作 371
15.4.1 对文档对象模型导航 371
15.4.2 修改元素 375
15.4.3 创建和移除元素 377
15.4.4 处理事件 380
15.4.5 其他jqLite方法 382
15.4.6 从jqLite访问AngularJS的特性 382
15.5 使用jQuery替换jqLite 383
15.6 小结 385
第16章 创建复杂指令 386
16.1 准备示例项目 386
16.2 定义复杂指令 387
16.3 使用指令模板 392
16.3.1 使用函数作为模板 394
16.3.2 使用外部模板 395
16.3.3 通过函数选择一个外部模板 396
16.3.4 替换元素 397
16.4 管理指令的作用域 401
16.4.1 创建多个控制器 403
16.4.2 给每个指令实例创建自己的作用域 404
16.4.3 创建隔离的作用域 406
16.5 小结 416
第17章 高级指令特性 417
17.1 准备示例项目 417
17.2 使用嵌入包含 417
17.3 在指令中使用控制器 424
17.4 创建自定义表单元素 430
17.4.1 处理外部变化 432
17.4.2 处理内部变化 434
17.4.3 格式化数据值 435
17.4.4 校验自定义表单元素 436
17.5 小结 439
第3部分 Angular JS服务 442
第18章 模块与服务的协作 442
18.1 为什么以及何时使用和创建服务与模块 442
18.2 准备示例项目 443
18.3 使用模块建立应用 445
18.3.1 维护单个模块 445
18.3.2 创建新模块 447
18.4 创建和使用服务 448
18.4.1 使用Factory方法 448
18.4.2 使用Service方法 451
18.4.3 使用Provider方法 453
18.5 使用内置模块和服务 455
18.6 小结 456
第19章 针对全局对象、错误和表达式的服务 457
19.1 准备示例项目 457
19.2 接触DOM API全局对象 457
19.2.1 为什么使用以及何时使用全局对象服务 458
19.2.2 访问window对象 458
19.2.3 访问document对象 459
19.2.4 使用Interval和Timeout 460
19.2.5 访问URL 461
19.2.6 执行日志 467
19.3 异常处理 469
19.3.1 为什么以及何时使用异常服务 469
19.3.2 操作异常 469
19.3.3 直接使用异常服务 470
19.3.4 实现自定义异常处理器 471
19.4 处理危险数据 472
19.4.1 为什么以及何时使用危险数据服务 472
19.4.2 显示危险数据 473
19.4.3 使用不安全绑定 474
19.4.4 明确信任的数据 477
19.5 使用AngularJS表达式和指令 478
19.5.1 为什么以及何时使用表达式和指令服务 479
19.5.2 转换表达式为函数 479
19.5.3 插入字符串 482
19.5.4 编译内容 485
19.6 小结 487
第20章 Ajax和Promises服务 488
20.1 为什么以及何时使用Ajax服务 488
20.2 准备示例项目 489
20.3 产生Ajax请求 489
20.3.1 产生Ajax请求 492
20.3.2 接收Ajax响应 493
20.3.3 配置Ajax请求 496
20.3.4 设置默认的Ajax 500
20.3.5 使用Ajax拦截器 502
20.4 使用承诺 504
20.4.1 获取和使用Defered对象 505
20.4.2 令人着迷的承诺 507
20.4.3 理解为什么承诺不是正常事件 509
20.4.4 串联结果 509
20.4.5 分组承诺 511
20.5 小结 514
第21章 REST服务 515
21.1 为什么以及何时使用REST服务 515
21.2 准备示例项目 515
21.2.1 创建RESTful服务 516
21.2.2 创建AngularJS应用程序 519
21.3 使用$http服务 523
21.3.1 列出产品数据 523
21.3.2 删除产品 525
21.3.3 创建产品 526
21.3.4 更新产品 526
21.3.5 测试Ajax实现 527
21.4 隐藏Ajax请求 527
21.4.1 安装ngResource模块 530
21.4.2 使用$resource服务 531
21.4.3 配置$resource服务动作 536
21.4.4 创建现成的$resource组件 537
21.5 小结 539
第22章 视图服务 540
22.1 为什么以及何时使用视图服务 540
22.2 准备示例程序 540
22.3 使用URL路由 543
22.3.1 安装ngRoute模块 543
22.3.2 定义URL路由 544
22.3.3 显示选择的视图 546
22.3.4 接通代码和标记 546
22.4 使用路由参数 550
22.5 配置路由 556
22.5.1 使用控制器与路由 556
22.5.2 向路由添加依赖 558
22.6 小结 562
第23章 动画和触摸服务 563
23.1 准备示例项目 563
23.2 动画元素 563
23.2.1 为什么以及何时使用动画服务 564
23.2.2 安装ngAnimation模块 564
23.2.3 定义并应用动画 565
23.2.4 避免平行动画的危险 567
23.3 支持触摸事件 569
23.3.1 为什么以及何时使用触摸事件 569
23.3.2 安装ngTouch模块 569
23.3.3 处理触控手势 569
23.3.4 使用ng-click指令的替代品 571
23.4 小结 571
第24章 供应与注入服务 572
24.1 为什么以及何时使用供应和注入服务 572
24.2 准备示例项目 572
24.3 注册AngularJS组件 572
24.4 管理注入 574
24.4.1 确定函数依赖 575
24.4.2 获得服务实例 577
24.4.3 简化调用过程 578
24.4.4 从根元素中获取$injector服务 579
24.5 小结 580
第25章 单元测试 581
25.1 为什么以及何时做单元测试 581
25.2 准备示例项目 582
25.2.1 安装ngMocks模块 582
25.2.2 创建测试配置 582
25.2.3 创建示例应用程序 583
25.3 使用Karma和Jasmine 585
25.4 理解仿造对象 588
25.5 测试控制器 589
25.6 使用仿造对象 592
25.6.1 仿造HTTP响应 592
25.6.2 仿造时间周期 596
25.6.3 测试日志 598
25.7 测试其他组件 601
25.7.1 测试指令 602
25.7.2 测试服务 604
25.8 小结 606