angular2Angular.js专场让前端飞

Angular2 入门

2017-06-08  本文已影响1062人  46f31ed46b17

AngularJS2 是一款开源的JavaScript MV*(MVC、MVW、MVVM)框架,目前由Google维护。AngularJS弥补了HTML在构建应用方面的不足,其通过使用标识符(directives)结构,来扩展Web应用中的HTML词汇,使开发者可以使用HTML来声明动态内容,从而使得Web开发和测试工作变得更加容易

1. Angular 简介

1.1 AngularJs 历史

回过头来看 Angular 的发展历程,Angular 一路高歌猛进,不断发展。虽然Angular 提出了很多全新的概念,也给前端开发带来了很多新的开发模式。但是这种颠覆性的改变,往往会给我们带来学习上的成本。所以 Angular 的学习曲线的确是比较曲折

1.2 AngularJS 1.x 的困境

随着前端领域的快速发展。前端体系变得越来越复杂,AngularJS 好像有点更不上时代的步伐,毕竟是09年的框架。也暴露出越来越多的不足:

1.3 AngularJS 2.x 的涅磐重生

虽然 Angular 1.x 每一次更新都再不断进步,但是毕竟一直都是在09年下的框架下做调整,背负这 Angular 的历史包袱,很难做到颠覆性的改变。每一个框架都有它自己的生命周期,AngularJs 1.x 显然已经跟不上前端发展的步伐。好在早在2014年3月,官方微博就有提及新 Angular 的开发计划。终于在2016年9月中旬正式对外发布。Angular 2 完全抛掉了历史包袱,以一个全新的框架出现在我们面前。但是 Angular 2 并不兼容 Angular 1.x,虽然官方推出迁移方案及工具。对于 Angular 1.x的迁移工作,可能会让很多人望而生畏。Angular 2到底我还该不该学,会不会又进入一个深坑?很高兴的告诉大家,抛弃了 Angular 1.x的历史包袱,全新规划的 Angular 2 很好的解决了 Angular 1.x 留下的历史问题。让我们一起来看看涅磐重生后的 Angular 2 有那些新特性:

2. Angular 核心

Angular 2 应用程序应用主要由以下 8 个部分组成:
1、模块 (Modules)
2、组件 (Components)
3、模板 (Templates)
4、元数据 (Metadata)
5、数据绑定 (Data Binding)
6、指令 (Directives)
7、服务 (Services)
8、依赖注入 (Dependency Injection)。
下图展示了每个部分是如何相互工作的:


overvie

  图中的模板 (Templates)是由 Angular 扩展的 HTML 语法组成,组件 (Components)类用来管理这些模板,应用逻辑部分通过服务 (Services)来完成,然后在模块中打包服务与组件,最后通过引导根模块来启动应用。
与用户直接交互的是模版,模版接收来自用户的操作,通过数据绑定与对应的组件类交互,组件类完成处理后,更新模版试图来反馈给用户。组件处于angular2中比较核心的地位,而指令及服务,都是作为组件的扩展
当然一上来就看到这么多核心,可能有些同学会害怕。不用着急,我们只需要记住 Angular 2的核心是“组件 (Components)”,其他的所有核心都是为组件提供服务而衍生的。
接下来我们会对以上 8 个部分分开解析:

2.1 模块 (Modules)

Angular 应用程序是模块化的。每个 Angular 应用程序拥有至少一个 模块 ,即根模块,用来引导并运行应用。 你可以为它取任何名字。常规名字是 AppModule 。每个模块都是一个内聚的代码块专注于某个应用领域、工作流或紧密相关的功能。

装饰器是TypeScript语法,用来修饰 JavaScript 类的函数。 Angular 有很多装饰器,它们负责把元数据附加到类上,以了解那些类的设计意图以及它们应如何工作。

2.2 组件 (Components)

2.3 模板 (Templates)

2.4 元数据 (Metadata)

元数据告诉 Angular 如何处理一个类。考虑以下情况我们有一个组件叫作 Component ,它是一个类,直到我们告诉 Angular 这是一个组件为止。你可以把元数据附加到这个类上来告诉 Angular Component 是一个组件。在 TypeScript 中,我们用 装饰器 (decorator) 来附加元数据。

2.5 数据绑定 (Data Binding)

数据绑定在模板与对应组件的交互中扮演了重要的角色,如果没有数据绑定,我们得自己把数据推送到 HTML 中。手工编写这些代码枯燥无味,并且容易出错。相信写过 JQuery 的程序员都深有体会。
而数据绑定的出现,很好的解决了这个问题

databinding

数据属性值通过属性绑定从组件流到输入框。用户的修改通过事件绑定流回组件,把属性值设置为最新的值。

数据绑定为应用程序提供了一种简单而一致的方法来显示数据以及数据交互,它是管理应用程序里面数值的一种机制。通过这种机制,可以从 HTML 里面取值和赋值,使得数据的读写,数据的持久化操作变得更加简单快捷。如图所示,数据绑定的语法有四种形式。每种形式都有一个方向——从 DOM 来、到 DOM 去、双向,就像图中的箭头所示意的。

databinding2
  1. 插值 : 在 HTML 标签中显示组件值。

    <h3>{{title}}</h3>
    
  2. 属性绑定: 把元素的属性设置为组件中属性的值。

    <img [src]="userImageUrl">
    
  3. 事件绑定: 在组件方法名被点击时触发。

    <button (click)="onSave()">保存</button>
    
  4. 双向绑: 使用 Angular 里的 NgModel 指令可以更便捷的进行双向绑定。

    <input [value]="currentUser.firstName"
        (input)="currentUser.firstName=$event.target.value" >
    

另外数据绑定在父子组件通讯也非常重要:

parent-child-binding

2.6 指令 (Directives)

Angular模板是动态的。当 Angular 渲染它们时,它会根据指令对 DOM 进行修改。

directive

2.7 服务 (Services)

服务是一个广义范畴,包括:值、函数,或应用所需的特性。几乎任何东西都可以是一个服务。 典型的服务是一个类,具有专注的、明确的用途。它应该做一件特定的事情,并把它做好。

service

2.8 依赖注入 (Dependency Injection)

在传统的开发模式中,调用者负责管理所有对象的依赖,循环依赖一直是梦魇,而在依赖注入模式中,这个管理权交给了注入器(Injector),它在软件运行时负责依赖对象的替换,而不是在编译时。
Angular 能通过查看构造函数的参数类型,来得知组件需要哪些服务。

injector-injects

当 Angular 创建组件时,会首先为组件所需的服务请求一个注入器 (injector)。注入器维护了一个服务实例的容器,存放着以前创建的实例。 如果所请求的服务实例不在容器中,注入器就会创建一个服务实例,并且添加到容器中,然后把这个服务返回给 Angular。 当所有请求的服务都被解析完并返回时,Angular 会以这些服务为参数去调用组件的构造函数。 这就是依赖注入

我们知道每个 Angular 应用对应这一棵组件树,要了解分层注入,首先要了解一下组件树与依赖注入的关系。回到前面的例子,大家会不会有个疑问,是否每个组件都需要注入 LoggerService 才能使用这个服务呢。答案是否定的。当我们在某个组件里注入服务后,它以及他的所有子组件都能复用到这个服务。而且是保持单例的形态。例如根组件的日志级别是 warn 的,则所有的子组件也会是 warn 级别。LoggerService 只需要实例化并只配置一次。但是当项目越来越庞大的时候。可能某个子组件需要打印出更详细的日志信息。大家思考一个问题,如果修改子组件的日志级别可以吗?很显然,由于注入的 LoggerService 是单例的,当你修改子组件的日志级别以后,注入 LoggerService 的根组件及其子组件的日志级别都会跟着变化。这个时候便需要使用分层注入。分层注入允许我们在组件里重新创建一个新的实例,只需要在对应的组件里重新注入 LoggerService 即可。分层注入源于组件树里的不同层级。

3. Angular 2 环境搭建

3.1 环境准备

请先在终端/控制台窗口中运行命令 node -v 和 npm -v, 来验证一下你正在运行 node 6.9.x 和 npm 3.x.x 以上的版本。 更老的版本可能会出现错误,更新的版本则没问题。

3.2 使用 Angular-cli 快速搭建工程

Angular-cli 是用来快速搭建 Angular 项目的工具,在开发过程中,一个良好的前端框架非常重要,对于后续的开发,维护,团队协作等都有重要的意义。他本质也是使用了webpack 来编译,打包,压缩等构建的事情,类似于 java 中的 maven,约定大于配置。

Successfully initialized git.
Installing packages for tooling via npm.
Installed packages for tooling via npm.
You can `ng set --global packageManager=cnpm
Project 'helloworld' successfully created.


安装成功后会看到以上的信息。进入文件目录看一下项目结构,先有个印象

![files](https://img.haomeiwen.com/i6278284/185247ad0b129591.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

- **运行起来看看吧** 

    进入项目目录,并启动服务器。

    `>cd helloworld`
    
    `>ng serve`

    浏览器输入 http://localhost:4200/ 就可以看到

![injector-injects](https://img.haomeiwen.com/i6278284/8be3eb14f5c240c7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

- **目录结构说明** 
    
  Angular 为我们生成了项目结构。大部分情况下,我们只在 src 下的工作,所有的 Angular 组件、模板、样式、图片以及你的应用所需的任何东西都在那里。这个文件夹之外的文件都是为构建应用提供支持用的,一般情况下不需要修改。

```javascript
+---e2e                              // 在e2e/下是端到端(End-to-End)测试。
|       
+---node_modules                     // package.json中列举的所有第三方模块都放在其中
|
 \---src                             // 代码源文件
|    |   favicon.ico                 // 图标 
|    |   index.html                  // 网站首页
|    |   main.ts                     // 这是应用的主要入口点  
|    |   polyfills.ts                // 标准化   
|    |   styles.css                  // 样式文件
|    |   test.ts                     // 测试入口
|    |   tsconfig.app.json           // TypeScript编译器对应用的配置文件
|    |   tsconfig.spec.json          // TypeScript编译器对测试的配置文件
|    |   typings.d.ts                // TypeScript用于标记对象类型文件
|    |   
|    +---app                         // app模块文件夹,类似与java的包
|    |       app.component.css       // app模块的样式文件
|    |       app.component.html      // app模块的HTML模版
|    |       app.component.spec.ts   // app模块的测试文件
|    |       app.component.ts        // app模块逻辑处理
|    |       app.module.ts           // app模块入口
|    |       
|    +---assets                      // 资源文件夹
|    |       .gitkeep                // 没什么卵用,git用的
|    |       
|    \---environments                // 环境配置
|            environment.prod.ts     
|            environment.ts          
|
|   .angular-cli.json                // Angular CLI的配置文件
|   .editorconfig                    // 编辑器看的一个简单配置文件 
|   .gitignore                       // git用的,与svn的ignore一个意思
|   karma.conf.js                    // Karma的单元测试配置
|   package.json                     // npm配置文件,其中列出了项目使用到的第三方依赖包
|   protractor.conf.js               // 给Protractor使用的端到端测试配置文件
|   README.md                        // 项目说明文件
|   tsconfig.json                    // TypeScript编译器的配置
|   tslint.json                      // 代码风格 

3.3 使用 angular-cli 添加新的构建

3.4 单元测试

如果你的应用是使用 angular cli 创建的,那么 angular cli 会自动为你的项目配置好Karma test runner。当添加新的构建的时候,你可以使用 --spec 来指定是否为构建同时创建一个测试文件。如果是,angular cli 会为你的构建创建一个同名的.spec.ts文件。 并放在相同的目录下,这样你可以很方便的查找定位到各个构建的测试文件。

3.5 End-to-end(e2e) 端到端测试

Angular CLI 默认会使用 Protractor 框架来进行端到端的测试。

3.6 编译打包项目

开发时我们使用ng serve来编译和打包你的应用到虚拟的文件系统中。但是当我们想把应用部署到生产服务上时。我们就需要真实的文件让我们可以部署到指定的服务器或者云上。

3.7 环境 Environments

angular cli 允许我们在angular-cli.json中定义环境信息。:

3.8 总结

看完本章内容,你应该懂得如何使用Angular CLI做到以下几点:

虽然 Anhular CLI 对于 Angualr 并不是必须,你也可以手动创建 Angular 应用,定制项目的结构,自己编写webpack 配置文件等。但是毫无疑问的是 Angular CLI 不仅可以为我们构建项目节约大量的时间,也提供了高质量的代码结构等。

上一篇下一篇

猜你喜欢

热点阅读