精通AngularJS
作者简介:
Pawel Kozlowski有15年以上的Web开发经验,接触过多种Web技术、语言和平台。他精通客户端和服务器端编程,并始终在寻找能提高生产率的工具和流程。Pawel是自由和开源软件的坚定支持者,他在 AngularJS 社区非常活跃,为AngularJS项目贡献了大量的代码。他也对Angular UI (AngularJS的配套框架)有所贡献,并为AngularJS 提供了Twitter Bootstrap 相关的指令(directives)。不写代码时,Pawel 常在会议与活动上为AngularJS布道。 Peter Bacon Darwin已经积累了20年以上的编程经验,他在.NET发布之前,就已经用它工作了。他还对IronRuby的开发有所贡献。他曾在Avanade和IMGROUP做IT顾问。退休后,自由开发和照顾孩子占用了他大部分的时光。Peter是AngularJS社区的名人。他最近加入了Google的AngularJS团队。他还是Angular UI项目的创始成员。他曾在 Devoxx UK和其他活动中发表过有关AngularJS的演讲,并开办过AngularJS的培训课程。他希望帮助企业更好地利用 AngularJS。
内容简介:
AngularJS诞生于Google,已用于开发多款Google产品。它是一套JavaScript前端框架,用于开发当下流行的以数据驱动的单页面Web应用。其核心特性是:MVC、模块化、自动双向数据绑定、语义化标签、依赖注入等。《精通AngularJS》深入浅出地讲解了AngularJS的开发概念和原理,并通过丰富的开发实例向读者展示了构建复杂应用的完整过程,包括学习使用AngularJS特有的基于DOM的模板系统,实现复杂的后端通信,创建漂亮的表单,制作导航,使用依赖注入系统,提高Web应用的安全性,使用Jasmine开展单元测试,等等。
目录:
序 1 第 1 章 Angular之禅 7 11 邂逅AngularJS 7 熟悉框架 8 参与AngularJS项目 8 社区 8 在线学习资源 9 库和扩展 9 工具 9 Batarang 10 Plunker与jsFiddle 10 IDE扩展和插件 10 12 AngularJS速成 10 Hello World——AngularJS 示例 10 双向数据绑定 12 AngularJS中的MVC 模式 12 鸟瞰 13 深入作用域 15 视图 21 模块与依赖注入 26 模块 26 协作对象 27 注册服务 29 模块的生命周期 33 模块依赖 35 13 AngularJS和其他框架 38 jQuery 与 AngularJS 39 苹果与橙子 40 窥视未来 41 14 总结 41 第 2 章 构建与测试 43 21 介绍示例应用 44 熟悉问题领域 44 技术栈 45 持久化存储 46 MongoLab 46 服务器端环境 47 第三方JavaScript库 48 Bootstrap CSS 48 22 构建系统 48 构建系统准则 49 自动化所有事情 49 尽早报错,清晰报错 49 不同的工作流,不同的命令 50 构建脚本同样是代码 50 工具 50 Gruntjs 51 测试库与工具 51 Jasmine 51 Karma runner 52 23 组织文件和目录 52 根目录 52 进入源代码目录 54 AngularJS的特定文件 54 轻装上路 56 深入测试目录 57 文件命名约定 57 24 AngularJS模块和文件 57 一个文件,一个模块 58 模块内部 59 注册provider的不同语法 59 声明配置和运行块的语法61 25 自动化测试 62 单元测试 63 剖析Jasmine测试 64 测试AngularJS对象 65 测试服务 65 测试控制器 67 Mock对象和异步代码测试 68 端对端测试 70 日常工作流 71 Karma runner的提示与技巧 72 执行测试子集 73 调试 73 26 小结 74 第 3章 与后端服务器通信 75 31 使用 $http 进行 XHR和JSONP 请求 75 熟悉数据模型和MongoLab URLs 76 $http API快速导览 76 配置对象说明 77 转换请求数据 78 处理HTTP响应 79 转换响应数据 79 处理同源政策约束 79 利用JSONP克服同源政策约束 80 JSONP的限制 81 利用CORS克服同源政策约束 81 服务器端代理 83 32 promise API 与$q84 工作中的promise 和$q服务 85 学习$q服务的基础知识 85 promise是第一类JavaScript对象 87 聚合回调 88 注册回调和承诺的生命周期 88 异步动作的链式调用 89 关于$q的其他 91 AngularJS中的$q集成 93 33 promise API与 $http 94 34 与 RESTful 端点通信 95 $resource服务 95 构造级与实例级方法 97 $resource 创建异步方法 100 $resource服务的限制 101 使用$http 自定义 REST 适配器 101 35 使用$http 的高级特性 104 截取响应 104 36 测试与 $http 交互的代码 106 37 小结 108 第 4 章 显示与格式化数据 109 41 引用指令 109 42 显示表达式的求值结果 110 插值指令 110 利用ngBind渲染模型值 111 AngularJS表达式中的 HTML内容 111 43 条件化显示 112 根据条件包含内容块 114 44 用 ngRepeat 指令渲染集合 114 熟悉ngRepeat 指令 115 特殊变量 115 迭代对象的属性 116 ngRepeat 模式 117 列表和细节 117 改动表格、行和类 119 45 DOM 事件处理器 120 46 基于DOM 的模板 121 习惯烦琐的语法 121 ngRepeat 和多个DOM 元素 122 不能在运行时修改的元素和属性 123 自定义HTML元素与 IE 的老版本 124 47 使用过滤器处理模型变换 124 内置过滤器 125 格式化过滤器 125 数组变换过滤器 125 编写自定义过滤器——分页示例 131 从JavaScript代码中访问过滤器 133 过滤器做什么与不做什么 134 过滤器与DOM操作 135 过滤器中代价高昂的数据变换 136 不稳定的过滤器 136 48 摘要 138 第5章 创建高级表单 139 51 AngularJS表单与传统表单的比较 139 介绍ngModel 指令 141 52 创建用户信息表单 142 53 理解输入指令 143 添加所需验证 143 使用基于文本的输入(text、textarea、e-mail、URL、number) 143 使用checkbox 输入 144 使用radio 输入 145 使用select 输入 145 提供简单的字符串options 145 利用ngOptions指令提供动态options 146 select指令与空的options 148 理解select和对象判等 149 选择多个options 150 运用传统的HTML hidden input 字段 150 嵌入来自服务器的值 150 提交传统的HTML表单 151 54 详解ngModel 数据绑定 151 理解ngModelController 151 在模型与视图之间转换值152 追踪值是否变化 152 跟踪input字段有效性153 55 校验AngularJS 表单 153 理解ngFormController 153 运用name属性将表单附加到作用域上 154 为用户信息表单增加动态行为 154 显示验证错误 155 让保存按钮无效 156 使原生浏览器校验无效 157 56 在其他表单中嵌套表单 157 将子表单作为可重用组件 157 57 重复子表单 158 验证重复输入 159 58 处理传统的HTML表单提交 161 直接向服务器提交表单 161 处理表单提交事件 161 使用ngSubmit处理表单提交 162 使用ngClick处理表单提交 162 59 重置用户信息表单 162 510 摘要 164 第 6 章 导航 165 61 单页Web应用的URL 166 HTML5之前的Hashbang URL 166 HTML5和history API 167 62 使用 $location服务 168 理解$location服务API与 URL的关系 169 哈希、页面内导航和 $anchorScroll 170 配置HTML5方式的URL 171 客户端 171 服务端 171 使用$location 导航 172 根据路由构建页面 173 路由映射URL 174 定义路由时指定控制器 174 导航的不足 175 63 使用AngularJS自带的路由服务 175 基础路由定义 175 显示匹配的路由内容 176 匹配灵活的路由 177 定义默认路由 178 访问路由参数 178 多个控制器重用局部模板 178 路由改变时避免UI 抖动 179 取消路由更新 181 64 $route 服务的局限 182 一个路由只对应页面中的一个区域 183 使用ng-include处理多个UI区域 183 不支持嵌套路由 184 65 路由相关的模式及技巧 185 处理链接 185 创建可点击的链接 186 兼容HTML5及hashbang模式 186 链接外部页面 187 组织路由定义 187 将路由定义分离到多个模块 188 减少路由定义的重复代码 188 66 总结 189 第7 章 安全 191 71 提供服务端认证和授权 192 处理未授权的访问 192 提供服务端验证API 192 72 保护局部模板 193 73 阻止恶意攻击 194 防止cookie 监听、中间人攻击 194 防止跨站脚本攻击 195 确保AngularJS 表达式内HTML 内容的安全性 195 允许不安全的HTML 绑定 196 净化HTML 196 防止JSON 注入攻击 197 防止跨站请求伪造 198 74 客户端安全 198 创建security 服务 199 显示登录表单 200 创建安全的菜单及工具栏 201 隐藏菜单项 201 创建登录工具栏 202 75 支持客户端认证 203 处理认证失败 203 拦截响应 204 HTTP响应拦截器 204 创建 securityInterceptor 服务 205 创建securityRetryQueue 服务 207 通知安全服务 208 76 防止导航到安全受限路由 208 使用路由resolve函数 209 创建授权服务 210 77 总结 212 第 8 章 创建自定义指令 213 81 什么是 AngularJS 指令 214 理解内置指令 214 在HTML标签中使用指令 215 82 指令的编译生命周期 215 83 为指令编写单元测试 217 84 定义指令 218 85 使用指令修改按钮样式 219 编写一个按钮指令 220 86 理解 AngularJS的组件指令 222 编写一个分页指令 222 为分页指令编写单元测试代码 223 在指令中使用HTML模板 224 从父作用域中隔离指令 225 使用@插入属性 226 使用=绑定数据 227 使用&提供一个回调表达式 227 实现分页组件 228 为指令添加分页跳转回调 229 87 创建一个自定义验证指令 230 需要其他指令的控制器 231 可选的依赖控制器 231 查找祖先元素的控制器 232 使用ngModelController 232 编写自定义验证指令的单元测试 233 实现自定义验证指令 235 88 创建一个异步模型验证器 235 模拟用户服务 236 为异步验证编写测试代码 237 实现异步验证指令 238 89 包装 jQueryUIdatepicker 指令 239 为包装组件指令编写测试代码 240 实现jQuery datepicker 指令 242 810 小结243 第9章 创建自定义指令 245 91 使用嵌入 245 在指令中使用嵌入 245 在独立作用域指令中使用嵌入 246 创建一个使用嵌入的提示指令 246 理解指令定义中的replace属性 247 理解指令定义中的transclude属性 248 使用ng-transclude插入嵌入元素 248 理解嵌入作用域 248 92 创建和使用嵌入函数 250 使用$compile 服务创建一个嵌入函数 251 在嵌入时克隆原始元素 251 在指令中访问嵌入函数 252 通过编译函数中的transcludeFn来获取嵌入函数 252 通过$transclude在指令控制器中获取嵌入函数 253 使用嵌入创建一个if 指令 253 在指令中使用priority属性 255 93 理解指令控制器 256 为指令控制器注入特殊依赖 257 创建一个基于控制器的分页指令 258 理解指令控制器和链接函数的区别 258 注入依赖 259 编译过程 259 获取其他控制器 260 获取嵌入函数 261 创建一个手风琴指令套件 261 在手风琴组件中使用指令控制器 262 实现accordion指令 263 实现accordion-group指令 263 94 控制编译过程 265 创建一个field指令 265 在指令中使用terminal属性 267 使用$interpolate 服务 268 绑定验证信息 269 动态加载模板 269 设置field指令的模板 270 95 小结271 第 10章 创建为全球用户服务的AngularJS应用 273 101 使用本地化的符号和设置 274 配置本地化设置模块 274 使用已有的本地化设置 275 本地化设置和AngularJS过滤器 275 102 处理翻译 277 翻译AngularJS模板中的字符串 277 使用过滤器 278 使用指令 279 翻译JavaScript代码中的字符串 280 103 范式、秘诀和技巧 282 按照设定的地区初始化应用 282 将地区标识作为URL一部分带来的问题 283 切换地区 284 针对日期、数字和货币的自定义过滤器 285 104 小结 287 第 11章 开发健壮的 AngularJS应用 289 111 理解AngularJS的内部运作机制 290 AngularJS不是基于字符串的模板引擎 290 响应DOM事件更新模型 291 将模型变化传播给DOM 291 同步DOM和模型变化 292 Scope$apply——打开AngularJS世界的钥匙 293 深入$digest循环 295 整合 300 112 性能优化——设置期望值、测量、调节、并重复 301 113 AngularJS应用的性能优化 303 优化CPU使用率 303 加速$digest循环 303 尽可能少进入$digest循环 310 限制每个$digest循环的执行轮数 312 优化内存占用 312 尽可能避免深度监视 312 注意监视表达式的大小 314 ng-repeat 指令 314 ng-repeat指令中对集合的监视 314 瞬间绑定大量监视 315 114 小结 315 第12章 打包和部署 AngularJS Web 应用 317 121 提升网络相关的性能 318 压缩静态资源 318 AngularJS如何判断依赖关系 318 编写会被安全压缩的JavaScript代码 319 数组风格依赖注入的缺陷322 模板预加载 323 使用