Angular 权威教程

内容简介

本书堪称 Angular 领域的里程碑式著作,涵盖了关于 Angular 的几乎所有内容。对于没有经验的人,本书平实、通俗的讲解,递进、严密的组织,可以让人毫无压力地登堂入室,迅速领悟新一代 Web 应用开发的精髓。如果你有相关经验,那本书对 Angular 概念和技术细节的全面剖析,以及引人入胜、切中肯綮的讲解,将帮助你彻底掌握这个框架,在自己职业技术修炼之路上更进一步。本书的读者对象为所有想要理解和学习 Angular 的前端开发人员。

作者简介

Angular 权威教程

Ari Lerner,全栈工程师,拥有多年 Angular 经验,自办并运营 Angular 电子报 ng-newsletter.com,在著名硅谷工程师培训学校 Hack Reactor 担任 AngularJS 讲师。Fullstack.io 创始人。

Felipe Coury,Gistia Labs 联合创始人兼 CTO。

Nate Murray,全栈工程师,曾任职于 IFTTT,拥有数据挖掘和增量 Web 服务等方面的背景。

Carlos Taborda,Gistia Labs 联合创始人兼主管。

本书内容
推荐序

很高兴这本《Angular 权威教程》成为 Angular 中文资源的一部分,希望它能广受欢迎,给中国的 Angular 社区提供一份令人愉悦的学习资源,也希望它帮助更多工程师开始使用下一代 Angular 框架来开发应用。

我认识雪狼和他所属的 Nice Angular 社区是在2016年。那时候,他们开始了对 Angular 官方网站卓越的本地化工作。现在,这份中文官网已经部署在了 angular.cn 上。

本书及其翻译工作充分体现了中国开源软件开发者的热情和共享精神。感谢雪狼等来自 Nice Angular 社区的志愿者们对此作出的贡献。愿本书帮助你开始试用 Angular!祝你成功!

Naomi Black,Google Angular 项目经理兼主管


作为一项开源技术和前沿 Web 开发框架,Angular 持续吸引着中国区开发人员的关注。作为雪狼及其所属 Nice Angular 社区的集体工作成果,这本书是开源力量的又一次证明,证明这种热情、这种志愿精神确实可以帮助业界享受到全球最新的开发技术。我谨代表 Google 开发技术推广部向这本书的出版表示祝贺。

栾跃,Google 开发技术推广部大中华区主管

译者序

简介

以笔者之所见,《Angular 权威教程》大概是目前除了 Angular 官方文档之外最全面的学习资料了,这从其英文版多达600多页的篇幅就可见一斑。相应地,它面对的对象涵盖了从入门级到中高级的读者,是一本可以陪伴你成长的好书。

在内容安排上,本书具有大量的例子以保障其足够浅显,但也穿插着一些原理分析以保障其足够深入。除此之外,本书还给出了很多外部参考资料,让富有探险精神的你可以向专家级进发。

翻译说明

未来的版本号及发布计划

Angular 就要出4.0了!是的,过一阵子还有 Angular 5/6/7/8……这本书会很快过时吗?答案是“不会”。Angular 开发组对于未来的版本号及发布计划有一个正式的说明,大意是:

我们要兼顾向后兼容和向前演进,因此以后我们将严格遵循 SemVer 语义化版本规范,并力求让版本升级变得可预测,以便使用者可以提前安排。在大版本号之间会出现少量破坏性变更,但是不用担心,相邻的大版本号之间只会把一些 API 标记为废弃的。也就是说,理想情况下,4的程序是可以直接迁移到5的,只是会收到一些 API 废弃提示,到6中才会彻底移除。同时,官方会在文档中给出详细的升级指南,帮助开发者升级。

因此,尽请放心,Angular 以后绝不会出现像从1升级到2这么大的变化。事实上,NodeJS 现在采用的就是类似的版本策略,提高发布的可预测性对于工程化开发是很有价值的。

另外,这里为什么没有3?简单点说就是因为路由模块比其他模块多发布过一次,因此当你使用 core 模块的2.0时,和它配套的 router 模块却是3.0的,这容易让开发人员困惑,跳过3,可以让所有模块的编号重新对齐。

对框架名称的说明

Angular 开发组正式确定了新的命名策略:用 AngularJS 来代表 1.x 版本,而 Angular 代表 2.x、4.x、5.x 等很多后续版本,因为 Angular 2+ 将支持 TypeScript/JavaScript/Dart,而不再是 JavaScript。这些变化已经在官方文档中体现出来了,而本书也将同样遵循这样的命名策略。

名词:装饰器与注解

@Component等语法元素在 TypeScript 中被称为装饰器(decorator),但在本书中,作者统一称其为注解(annotation)。这两种提法都是正确的。在语法层面,@Component确实是装饰器,这是 TypeScript 的标准叫法;但是在语义层面,Angular 中是把它作为注解使用的。两者的区别是,装饰器直接改变被装饰者的行为,而注解则提供元数据,供框架去根据这些元数据做不同的处理。在 Angular 目前的版本中,@Component确实只是提供了元数据。

我们在跟原作者讨论之后,决定还是跟随作者的提法来翻译。不过在日常工作中,还是建议你遵循 TypeScript 的提法,将其称为装饰器。

支持与勘误

如果对本书中的一些概念不太理解,请参阅 Angular 官方中文站 angular.cn。这里有来自官方开发组的权威资料。

如果对本书有任何疑问或发现问题,请到 https://github.com/nice-angular/ng-book-2 提交 issue。

同时,对于一些经过确认的 issue,我们也会更新在勘误区。

关于我们

参与本次翻译的一共有7位成员,都是 AngularJS 领域的专家和 Angular 领域的先行者。稍后会有我们的简短介绍。

本书各章的译者和校对者如下:

翻译一校二校
第1章雪狼、叶志敏郑丰彧郑丰彧
第2章破狼破狼雪狼
第3章张旋张旋雪狼
第4章郑丰彧郑丰彧雪狼
第5章破狼破狼雪狼
第6章王子实王子实雪狼
第7章叶志敏叶志敏叶志敏
第8章雪狼雪狼雪狼
第9章郑丰彧郑丰彧雪狼
第10章郑丰彧郑丰彧Hantsy
第11章郑丰彧郑丰彧Hantsy
第12章郑丰彧郑丰彧雪狼
第13章郑丰彧郑丰彧雪狼
第14章郑丰彧郑丰彧雪狼
第15章HantsyHantsy叶志敏
第16章雪狼雪狼张旋

除此之外,雪狼还承担了项目管理和中文统稿工作;破狼负责全书的技术准确性把关;叶志敏负责与作者沟通,并在英文理解方面进行把关。

我们的感恩

本书得以发行,首先要感谢 Angular 开发组及其项目经理 Naomi Black。正是由于她的支持和牵线搭桥,才有了我们和图灵的这次合作。

我们还要感谢 Google 开发技术推广部及其大中华区主管栾跃和项目经理程路,正是由于他们的努力,让 Angular 在中国的推广普及工作有了正规军的加入,而本书的出版正是推广计划中的一小部分。

我们还要感谢图灵的编辑朱巍和杨琳,在整个翻译过程中,她们给了我们许多专业的指导和帮助。本书得以在迅速出版的同时保证高质量,她们的经验和把关居功甚伟。

最后,要感谢 Angular 中文社区。我所指的并不是由我们几个创建并管理的这些 QQ 群、微信群等,而是指广义的中文社区。无论你在北京还是上海,也无论你在国内还是海外;无论你是高手还是新兵,也无论你是否像我们一样是 Angular 的忠实粉丝,你们都是广义 Angular 中文社区中的一员。在我们的心中,只有一个 Angular 中文社区,她不被任何人拥有,也被每一个人拥有,因为她就是我们每个人。

固然,我们这几位译者都是推广 Angular 的志愿者与先行者,但我们真正希望看到的是一个繁荣、开放、互通的中文社区,是全球 Angular 社区的一部分,我们希望看到 Angular 的技术社区遍地开花。因此,如果你有自己的组织或影响力,请联系我们,我们愿与你携手共进,分享各种知识、渠道与资源,共同制定与推进社区发展计划。要知道,无论你将来是求职还是创业,一个繁荣的社区都会给你带来强力的支持。

一旦有了共同的愿景和开放、包容的文化,我们就能无视时空的阻隔,在天南海北守望相助,共同面对新技术的挑战与机遇。纷繁的世界、冰冷的技术与温暖的社区,共同构成了本书的出版背景。

雪狼的感恩

汪志成,网名雪狼。ThoughtWorker & Google 开发者专家(GDE),拥有18年软件开发经验,崇尚简单、专业、分享,“好为人师,好为人师”;合著有《AngularJS深度剖析与最佳实践》。

首先,我要感谢我的家人,特别是我的妻子春娜。为了翻译官方文档和这本书,我失去了很多陪伴他们的时间,没有他们的支持,故事将无从开始。

其次,我要感谢 ThoughtWorks,没有这样一个平台,我就无法安心钻研技术,更没有大量把新技术应用于工程实践中的机会。

最后,要特别感谢我刚刚出生的女儿,你是激励我前进的动力。闺女,看到了吗?这是老爹给你的迎新礼物。

破狼的感恩

格茸扎西,网名破狼。ThoughtWorks 一线码农、架构师、咨询师;爱好读书和旅游,也常涂鸦一些技术博文;合著有《AngularJS 深度剖析与最佳实践》;国内 Angular 最早布道者,Nice Angular 社区“狼主”。

首先,要感谢我的妻子和父亲。因为他们的鼓励,我才能顺利完成本书相应章节的翻译。

其次,要感谢 ThoughtWorks 这个大家庭。因为在这个自组织和黑客文化环境的熏陶下,我才能潜心钻研这些技术。

最后,要感谢图灵出版社的朱巍编辑、本书的作者以及其他译者们。

叶志敏的感恩

叶志敏,虽留英多年、远漂他乡、四处奔波,一颗热爱软件开发的心却依旧如初。多年前曾与雪狼共事,合作愉快,因此成为好朋友。由雪狼推荐进入 Angular 世界,使用 Angular 和 .NET 平台开发软件多年。从 Alpha 阶段开始使用 Angular。与雪狼合作,翻译 Angular 官方文档站,并经过 Angular 团队的推荐,承接翻译本书的重任。

首先感谢我的妻子。从怀孕到照顾女儿健康成长,她一直对我的工作非常理解和支持,从无怨言。其次,感谢我母亲和岳母的慈爱与帮助。最后,希望女儿能健康成长,平安一生。

Hantsy 的感恩

Hantsy,拥有15年软件工程经验。2012年曾受JBoss(RedHat 子公司)邀请前往波士顿参加 JBoss 用户和开发人员年度大会,并获得 JBoss Community Recognition Awards。现为自由职业者,远程工作多年。

感谢 Angular 中文团队和图灵的支持,非常荣幸参与本书中文版的翻译。感谢 Angular 团队的努力,为我们带来如此优秀的工具框架。

张旋的感恩

张旋,PMP、ACP、NPDP,中科院计算所烟台分所集成应用中心主任。1982年生人,1996年起接触编程。正式从事软件工作行业11年。擅长项目管理、团队管理、技术体系建设。非常喜欢研究和对比各种新技术,生成适合工程使用的技术栈,并灌输到整个团队中去。

十分荣幸能成为 Nice Angular 社区的一员,感谢雪狼和破狼。感谢本书原作者为我们提供了一本这么好的 Angular 教程,也感谢本书的所有翻译者,从你们身上我确实学到了很多。感谢我的老婆莉莉,照看乐乐辛苦了,谢谢你给我时间让我做自己喜欢的事。最后感谢图灵出版社的朱巍编辑,本次合作非常愉快,期待下次更好的机会!

郑丰彧的感恩

郑丰彧,网名Z,现就职于大商集团天狗网,Angular 爱好者,喜欢函数式编程、WebGL。

首先,我要感谢雪狼,一次很偶然的机会受到雪狼的邀请,让我受宠若惊,也为我开启了这次 Angular 翻译之旅。

其次,我要感谢我的家人,尤其是有孕在身的老婆和孕育中的宝宝。为了翻译这本书,我牺牲了很多原本用来陪伴你们的时间。

最后,我想对即将出世的女儿柚柚说句话:我们全家人对你的期待正如我们 Nice Angular 社区对此书的期待。所以,赶快“问世”吧!

王子实的感恩

王子实,现任光辉城市全栈工程师。1992年生,自学生时代便喜好编程,一直以来对各种新技术非常着迷,乐于对其进行研究与探索,并将成果在团队中进行推广,以提升整体效率。

非常感谢雪狼能够给我这次机会参与到本书的翻译中来,能够让我对 Angular 社区尽一点点自己的绵薄之力。

同时也要感谢其他参与翻译的译者们,让我有了这次非常宝贵的经验。尤其是在翻译过程中遇到一些技术问题以及对原书内容有一些疑惑时,大家探究与实践的精神让我印象深刻。

还要感谢我的妻子默默给予我支持与理解。

最后,就是要感谢 Google 带给我们 Angular 这个强大而又好用的框架。希望它也能越来越好,不断进步!

编写你的第一个 Angular Web 应用(上)

      • 1.1 仿制 Reddit 网站
      • 1.2 起步
        • 1.2.1 TypeScript
        • 1.2.2 angular-cli
        • 1.2.3 示例项目
      • 1.3 运行应用
        • 1.3.1 制作Component
        • 1.3.2 导入依赖
        • 1.3.3 Component注解
        • 1.3.4 用templateUrl添加模板
        • 1.3.5 添加template
        • 1.3.6 用styleUrls添加 CSS 样式
        • 1.3.7 加载组件
      • 1.4 把数据添加到组件中

1.1 仿制 Reddit 网站

在本章中,我们将构建一个应用,它能让用户发表推荐文章(包括标题和URL)并对每篇文章投票

你可以把该应用看作类似于Reddit{1[http://reddit.com]}或 Product Hunt{2[http://producthunt.com]}的起步版网站。

这个简单的应用将涵盖 Angular 中的大部分基本要素,包括:

  • 构建自定义组件;

  • 从表单中接收用户输入;

  • 把对象列表渲染到视图中;

  • 拦截用户的点击操作,并据此作出反应。

读完本章之后,你将掌握如何构建基本的 Angular 应用。

图1-1展示了该应用最终完成后的界面截图。

图1-1 完成后的应用

首先,用户将提交一个新的链接。之后,其他用户可以对每篇文章投票:“顶”或“踩”。每个链接都有一个最终得票数,我们可以对自己认为有用的链接投票(如图1-2所示)。

图1-2 包含新文章的应用

在本项目和整本书中,我们都将使用 TypeScript。TypeScript 是 JavaScript ES6 版的一个超集,增加了类型支持。本章不会深入讲解 TypeScript;如果你熟悉 ES5(“普通”的JavaScript)或 ES6(ES2015),那么在后续的学习过程中应该不会有什么问题。

在第2章中,我们将更深入地学习 TypeScript。因此,即使你对某些新语法不太熟悉,也不必担心。

1.2 起步

1.2.1 TypeScript

要开始使用 TypeScript,首先需要安装 Node.js。安装方式很多,请参见 Node.js 官方网站(https://nodejs.org/download/)了解详情。

我必须用 TypeScript 吗?并非如此!要使用 Angular,TypeScript 并不是必需的,但它可能是最好的选择。Angular 也有一套 ES5 API,但 Angular 本身就是用 TypeScript 写成的,所以人们一般也会选用它。本书也将使用 TypeScript,因为它确实很棒,能让 Angular 写起来更简单。当然,并不是非它不可。

安装完 Node.js,接着就要安装 TypeScript了。请确保安装1.7或更高的版本。要想安装它,请运行下列npm命令:

$ npm install -g typescript

通常,npm是 Node.js 的一部分。如果你的系统中没有npm命令,请确认你安装的 Node.js 是包含它的版本。**

Windows 用户:我们将在全书中使用 Linux/Mac 风格的命令行。强烈建议你安装 Cygwin{3[https://www.cygwin.com/]}。借助它,你就能直接运行本书中的这些命令了。

1.2.2 angular-cli

Angular 提供了一个命令行工具angular-cli,它能让用户通过命令行创建和管理项目。它自动化了一系列任务,比如创建项目、添加新的控制器等。多数情况下,选用angular-cli都是明智的决定。当你创建和维护应用时,它能帮你遵循很多常用模式。

要想安装angular-cli,只要运行下列命令即可:

$ npm install -g angular-cli@1.0.0-beta.18

安装完毕之后,你就可以在命令行中用ng命令运行它了。运行ng命令时,你会看到一大堆输出,不过不用管它;往回滚屏,你会看到如下内容:

$ ngCould not start watchman; falling back to NodeWatcher for file system events.Visit http://ember-cli.com/user-guide/#watchman for more info.Usage: ng 

之所以得到这一大堆输出,是因为当我们不带参数运行ng命令时,它就会执行默认的help命令。help命令会解释如何使用本工具。

如果你在 OS X 或 Linux 上运行,可能还会在输出中看到这一行:

Could not start watchman; falling back to NodeWatcher for file system events.

这意味着我们没有安装过一个名叫 watchman 的工具。此工具能帮助angular-cli监听文件系统的变化。如果你在 OS X 上运行,建议使用 Homebrew 工具安装它,命令如下:

$ brew install watchman

如果你是 OS X 用户并且运行这个brew命令时出现错误,那么表示你尚未正确安装 Homebrew 工具。请参阅http://brew.sh/来安装它,然后再试一次。

如果你是 Linux 用户,可以参阅https://ember-cli.com/user-guide/#watchman来学习如何安装 watchman。

如果你是 Windows 用户,那么不必安装任何东西,angular-cli将使用原生的 Node.js 文件监视器。

现在你应该已经装好angular-cli及其依赖了。在本章中,我们就用它来创建第一个应用。

1.2.3 示例项目

现在,环境已经准备好了,我们这就来编写第一个 Angular 应用吧!

打开终端窗口并且运行ng new命令,快速创建一个新的项目:

$ ng new angular2_hello_world

运行之后,你将看到下列输出:

installing ng 2  create .editorconfig  create README.md  create src/app/app.component.css  create src/app/app.component.html  create src/app/app.component.spec.ts  create src/app/app.component.ts  create src/app/app.module.ts  create src/app/index.ts  create src/app/shared/index.ts  create src/assets/.gitkeep  create src/assets/.npmignore  create src/environments/environment.dev.ts  create src/environments/environment.prod.ts  create src/environments/environment.ts  create src/favicon.ico  create src/index.html  create src/main.ts  create src/polyfills.ts  create src/styles.css  create src/test.ts  create src/tsconfig.json  create src/typings.d.ts  create angular-cli.json  create e2e/app.e2e-spec.ts  create e2e/app.po.ts  create e2e/tsconfig.json  create .gitignore  create karma.conf.js  create package.json  create protractor.conf.js  create tslint.jsonSuccessfully initialized git.( Installing packages for tooling via npm

它将运行一段时间,进行 npm 依赖的安装。一旦安装结束,我们会看到一条成功信息:

Installed packages for tooling via npm.

这里生成了很多文件!现在不用关心它们都是什么。我们会在本书中讲解每一个文件的含义和用途。不过现在,我们先把注意力集中在如何用 Angular 代码开始工作上。

进入ng命令创建的 angular2_hello_world 目录,来看看它里面都有什么:

$ cd angular2_hello_world$ tree -F -L 1.├── README.md              // an useful README├── angular-cli.json       // angular-cli configuration file├── e2e/                   // end to end tests├── karma.conf.js          // unit test configuration├── node_modules/          // installed dependencies├── package.json           // npm configuration├── protractor.conf.js     // e2e test configuration├── src/                   // application source└── tslint.json            // linter config file3 directories, 6 files

我们目前关注的目录是 src,应用代码就在里面。下面看看我们在那里创建了什么:

$ cd src$ tree -F.|-- app/|   |-- app.component.css|   |-- app.component.html|   |-- app.component.spec.ts|   |-- app.component.ts|   |-- app.module.ts|   |-- index.ts|   `-- shared/|       `-- index.ts|-- assets/|-- environments/|   |-- environment.dev.ts|   |-- environment.prod.ts|   `-- environment.ts|-- favicon.ico|-- index.html|-- main.ts|-- polyfills.ts|-- styles.css|-- test.ts|-- tsconfig.json`-- typings.d.ts4 directories, 18 files

用你惯用的文本编辑器打开 index.html,应该会看到如下代码。

code/first_app/angular2_hello_world/src/index.html

    Angular2HelloWorld        Loading...

我们把它分解一下。

code/first_app/angular2_hello_world/src/index.html

    Angular2HelloWorld  

如果你熟悉 HTML,这第一部分就很平淡无奇了。我们在这里声明了页面的字符集(charset)、标题(title)和基础 URL(base href)。

code/first_app/angular2_hello_world/src/index.html

  

如果你继续深入模板主体(body),就会看到下列代码。

code/first_app/angular2_hello_world/src/index.html

  Loading...

我们的应用将会在app-root标签处进行渲染,稍后剖析源代码的其他部分时还会看到它。文本 Loading...是一个占位符,在应用代码加载之前会显示它。我们可以借助此技巧来通知用户该应用正在加载,可以像这里一样显示一条消息,也可以显示一个加载动画或其他形式的进度通知。

之后就可以编写应用代码了。

1.3 运行应用

在开始修改之前,我们先把这个自动生成的初始应用加载到浏览器中。angular-cli有一个内建的 HTTP 服务器,我们可以用它来启动应用。回到终端,进入应用的根目录(在本应用中是./angular2_hello_world目录)并运行命令。

$ ng serve** NG Live Development Server is running on http://localhost:4200. **// a bunch of debug messagesBuild successful - 1342ms.

我们的应用正在 localhost 的4200端口上运行。打开浏览器并访问 http://localhost:4200,结果如图1-3所示。

注意,如果4200端口由于某种原因被占用了,也可以在其他端口号上启动。仔细阅读你电脑上的输出信息,找出开发服务器的实际 URL。

图1-3 运行中的应用

好,现在我们设置好了应用,而且知道了该如何运行它,可以开始写代码了。

1.3.1 制作Component

Angular 背后的指导思想之一就是组件化

在 Angular 应用中,我们写 HTML 标记并把它变成可交互的应用。不过浏览器只认识一部分标签,比如