2. Angular2 有哪些重要变化?
有了 Component 这个统摄全局的概念之后,我们来看看与 Angular 1.x 相比 Angular2 发生了什么变化。
第一点:Angular2 删掉了 $scope 的概念
在 Angular 1.x 里面,$scope 是一个相当强大又相当可怕的东西,由于在很多需要回调的场景之下,脏值检测机制无法感知到 $scope 上发生的变化,因此经常需要开发者自己手动调用 $apply() 方法。典型的场景有:事件回调、setTimeout 回调、Ajax 回调等等。Angular2 响应社区的强烈呼吁,删除(或者说隐藏)了 $scope 的概念,开发者不再需要感知到它的存在。另外,Angular2 在底层引入了 zone.js,所以即使在各种回调函数中修改数据模型也不需要手动调用 $apply() 方法了。
第二点:删掉了 ng-controller 指令
这就意味着 Controller 不再是一个独立的组件,它合并到了 Component 内部。这是一个非常大的演进,因为从大量的实战经验来看,在复杂的业务逻辑中复用 Controller 几乎是不可能的。在其它同类的前端框架里面也有类似的处理手法,例如 Backbone 虽然也强调 MVC 的概念,但是它也没有定义单独的 Controller 类,Controller 也是合并在 View 里面编写的。
第三点:大幅度演进了脏值检测机制
众所周知,“双向数据绑定”之所以能运行,是因为 Angular 底层有“脏值检测”这么一个神奇的机制。而实际上 Angular 1.x 里面的脏值检测机制的运行效率非常差,这就是为什么大家一直在抱怨绑定的对象不能太多、太深的原因。Angular2 大幅度演进了这一机制,不仅引入了单向绑定,还增加了各种检测策略,例如:只检测一次、利用 JIT 动态生成脏值检测代码等等。毫无疑问,有了这些工具之后,数据绑定效率不再是问题。
第四点:嵌套路由
Angular 1.x 里面有一个非常讨厌的问题,框架内置的路由机制不支持嵌套使用,这就导致开发者在日常的开发过程中不得不依赖于第三方的 ui-router 库。Angular2 没有这个问题了,因为 Angular2 的路由是基于 Component 的,天然支持嵌套。
第五点:依赖注入机制演进
Angular2 中的依赖注入写法与 Java 中的注解(Annotation)非常类似,如果你熟悉 Spring 注解的用法,那么使用 Angular2 的依赖注入几乎没有学习成本。当然,概念上是有区别的,Angular2 中叫 Decorator(装饰器),更加贴近 Python 里面的 Decorator 的概念。
第六点:框架整体上基于 TypeScript 开发
这是最大的一个变更,有很多人担忧这样是否会带来比较大的学习成本,实际的情况并非如此。因为 TypeScript 的语法与 Java 或者 C# 非常类似,因此对于从后端转过来的开发者来说,学习这门语言几乎是没有难度的。
还有一个重要的方面需要大家注意:TypeScript 是 Microsoft 开发的一门语言,Google+Microsoft 这样的组合会产生多么强大的推动力,大家可以想象。Google 和 Microsoft 本身都是重要的浏览器厂商,Chrome 和 IE 加起来的市场份额占据了一大半的市场份额,未来如果两款浏览器内建 TypeScript 引擎,很显然 TypeScript 和 Angular 的前景将会一片光明。这一优势是大量的同类技术框架根本无法企及的,因此大家在做技术选型的过程中需要综合考虑这些情况作出理性的决策。
第七点:Angular 1.x 和 Angular2 都自带 UI 控件库
两个版本的 UI 控件库都实现了 Material Design 所提出来的设计风格,Material Design 是 Google 提出来的一种 UI 设计原则,终极的目标是:用一套 UI 设计规范来兼容各种各样的设备,例如桌面、平板、大屏幕的电视、车载系统、甚至 watch,从而保证用户体验的一致性。
针对 Angular 1.x 的 Material Design 实现请参考以下链接:
https://github.com/angular/material。
针对 Angular2 的 Material Design 库,目前已经处于 alpha 状态,预计在本月(2016-09)底发布第一个正式版本,更多详情请参考:
https://github.com/angular/material2。
在现代 Web 应用开发中,尤其企业应用场景下,UI控件库是必不可少的组成部分。无论框架的设计理念多么前卫,我们最终都必须面对真实的业务开发,这里最大的现实就是:不可能让每一个企业或者团队都维护一套自己 UI 组件库。
我们知道开发一套能完美兼容各种屏幕的 UI 组件库需要消耗大量的时间和金钱,而长期维护这样一套体系更是无比枯燥的任务。所以说,Angular 默认提供免费的UI组件库这一点是目前市面上很多同类的技术所无法比拟的。