1. 说明

Angular 2 是一个用 HTML 和 JavaScript (或者可以编译成JavaScript)来构建应用程序的框架。该框架包含了一系列的库。

在 Angular 里,我们这样来构建应用程序:用带 Angular 扩展语法的 HTML 写模板 ,用 组件 类管理这些模板,用 服务 添加应用逻辑,

用 根组件 完成 Angular 启动 。

首先,我们来看一些整体的结构图,这个图来自于官方网站。

通过图可以看出,Angular 应用中的 8 个主要部分:

l 模块 (Modules)

l 组件 (Components)

l 模板 (Templates)

l 元数据 (Metadata)

l 数据绑定 (Data Binding)

l 指令 (Directives)

l 服务 (Services)

l 依赖注入 (Dependency Injection)

2. 模块

典型的模块是一个内聚的代码块,用来实现某种单一的功能。Angular2应用程序本质上是有一系列模块组成的,

而且Angular 本身就是一组模块库。模块主要是导出一些东西——类,函数,值,供其它模块导入,然后使用这个类,函数或者值。

比如,从 @angular/core 中导入 Component 函数:

import { Component } from '@angular/core';

3. 组件

组件 通常为一些属性和方法组成的类,用来与视图进行交互。例如,一个组件类可能如下所示,有个属性name可以在视图上显示,

属性值可能来自于服务appService,同时,也可能存在 changeName方法,当点击按钮的时候执行该方法。

export class AppComponent {

name: string;

constructor(private _appService: AppService) {

this.name = this._appService.defaultName;

}

changeName() {

this.name = 'dory';

}

}

4. 元数据

元数据告诉 Angular 如何处理一个类。在 TypeScript 中,用 装饰器 (decorator) 来附加元数据,给一个类附加上元数据,

就是告诉Angular框架这是一个组件或者服务,给对应的类附加相应的行为,例如给AppComponent附加组件元数据。

@Component({

selector: 'app',

template: `<h1>hello world</h1>

I am {{name}}

<button (click)="changeName()">更改名称</button>

`,

providers: [AppService]

})

export class AppComponent {

@Component 中的一些常见配置项:

selector :一个 css 选择器,它告诉 Angular 在 父级 HTML如何查找及定位该组件。

templateUrl /template:组件模板的地址/组件模板。

directives :一个数组,包含 模板需要依赖的组件或指令。

providers :一个数组,包含组件所依赖的服务。

5. 模板

模板 主要用来定义视图,以html的形式存在,用来告诉Angular图和渲染视图。多数情况下,模板看起来和标准html很像,例如

<h1>hello world</h1>

I am {{name}}

<button (click)="changeName()">更改名称</button>

这个模板有标准html元素 h1 button等,但是还存在一些 Angular自带的模板语法 {{}} , (click)等,这些以后再详细说明。

总体来说,Angular模板就是 html+Angular模板语法的结合体。模板和组件同时存在,整个Angular视图实际上是一个Angular组件模板树。

6. 数据绑定

Angular支持数据绑定,通过往模板添加各种标记,让模板中的标记与组件的各个部分对应起来,相互合作的机制。避免手工代码来实现将数据值推送到 HTML 控件中,

并把用户的反馈转换成动作和值更新,这种枯燥乏味、容易出错的推/拉逻辑。

Angular 在每个 JavaScript 事件周期中一次性处理 所有的 数据绑定,它会从组件树的根部开始,自顶向下处理各个叶节点。

数据绑定的语法有四种形式。

l 插值表达式:用{{}}来表示,显示组件中对应的属性或者函数。

l 属性绑定:用[]来表示,将对应的值绑定到模板元素的属性上。

l 事件绑定:用()来表示,用来执行对应的函数事件。

l 双向数据绑定 :一般使用 ngModel 指令来表示,同时实现了属性绑定和事件绑定的功能,常见用在表单中。

7. 指令

指令 用来对 DOM 进行相应的修改。 指令 和 组件 非常类似,也是一个带有“指令元数据”的类。在 TypeScript 中,要通过 @Directive 装饰器把元数据附加到类上,@Component 装饰器实际上就是一个 @Directive 装饰器,只是扩展了一些面向模板的属性,组件因而也可以称之为一个特殊的指令。

常用的指令有两种, “结构型”指令和“属性 (attribute) 型”指令。

结构型指令:通过在 DOM 中添加、移除和替换元素来修改布局。例如:ngFor,ngIf, ngSwitch等

“属性 (attribute) 型”指令:往往像属性 (attribute) 一样出现在元素标签中,偶尔会以名字的形式出现但多数时候还是作为赋值目标或绑定目标出现。

例如:ngStyle,ngClass,ngModel等

8. 服务

服务 分为很多种,包括:值、函数,类以及应用所需的特性。几乎任何东西都可以是一个服务。典型的服务就是一个类,

用来实现某种或某一类的应用或功能。通常情况下,服务作为组件的提供者,来提供特定的功能。例如,如下的AppService作为一个服务提供了一个默认的名称。

export class AppService {

defaultName: string = "timo";

}

9. 依赖注入

依赖注入是提供类的新实例的一种方式,同事还可以处理好类所需的全部依赖。大多数依赖注入都是服务,

Angular 使用依赖注入提供我们需要的组件以及这些组件所需的服务。Angular通过构造函数参数的类型,来得知需要哪些组件服务的。当 Angular 创建组件时,

会首先为组件所需的服务找一个 注入器(Injector)。

注入器是一个维护服务实例的容器,存放着以前创建的实例。

如果容器中还没有所请求的服务实例,服务提供商必须注册一个服务Provider到注入器中,注册服务的方式主要有两种:

1.在应用引导程序中注册,这样改服务的同一个实例在Angular整个应用程序都是可用的。

2. 在 @Component 元数据中的 providers 属性中注册,这样该服务只能在当前组件以及当前组件的子组件中进行访问

注入器根据该服务Provider来创建并返回对应的服务实例,并且添加到容器中,然后把这个服务返回给 Angular。当所有的服务都被解析完并返回时,

Angular 会以这些服务为参数去调用组件的构造函数。这就是依赖注入。

Angular2 架构的更多相关文章

  1. angular2架构详解

    参考  http://codin.im/2016/09/18/angular2-architecture-intro/ http://www.tuicool.com/articles/EvEZjmZ ...

  2. 最新Angular2案例rebirth开源

    在过去的几年时间里,Angular1.x显然是非常成功的.但由于最初的架构设计和Web标准的快速发展,逐渐的显现出它的滞后和不适应.这些问题包括性能瓶颈.滞后于极速发展的Web标准.移动化多平台应用, ...

  3. Angular2案例rebirth开源

    Angular2案例rebirth开源 在过去的几年时间里,Angular1.x显然是非常成功的.但由于最初的架构设计和Web标准的快速发展,逐渐的显现出它的滞后和不适应.这些问题包括性能瓶颈.滞后于 ...

  4. ASP.NET MVC和Web API中的Angular2 - 第1部分

    下载源码 - 903.5 KB 内容 第1部分:Visual Studio 2017中的Angular2设置,基本CRUD应用程序,第三方模态弹出控件 第2部分:使用Angular2管道进行过滤/搜索 ...

  5. Angular2.0的项目架构

    Angular2.0的项目架构 一.项目服务端app a) Controller控制器 b) Router路由 c) Service服务 d) Public公共样式及脚本和图片等静态资源 e) Vie ...

  6. Angular2入门-架构总览

    ▓▓▓▓▓▓ 大致介绍 在3月23日,Angular4正式发布(没有3).似乎现在学Angular2又晚了,又晚一步-_-||.Angular2在Angular1的基础上有了较大的改变.之前向一个同学 ...

  7. Angular2的模块架构浅谈

    引言angular2相比1引入了更完善的模块系统,回忆ng1的应用中通常在页面的html标签或body标签中添加ng-app节点,值为应用的模块名,整个应用都将围绕这个模块来展开,到了ng2,模块概念 ...

  8. angular2+ionic2架构介绍

    不要用angular的语法去写angular2,有人说二者就像Java和JavaScript的区别.   1. 项目所用:angular2+ionic2+typescript 2. 项目结构 3. S ...

  9. angular2.0 官网架构文档

    Angular 是一个用 HTML 和 JavaScript 或者一个可以编译成 JavaScript 的语言(例如 Dart 或者 TypeScript ),来构建客户端应用的框架. 该框架包括一系 ...

随机推荐

  1. java并发编程学习:用 Semaphore (信号量)控制并发资源

    并发编程这方面以前关注得比较少,恶补一下,推荐一个好的网站:并发编程网 - ifeve.com,上面全是各种大牛原创或编译的并发编程文章. 今天先来学习Semaphore(信号量),字面上看,根本不知 ...

  2. caffe的python接口学习(4):mnist实例---手写数字识别

    深度学习的第一个实例一般都是mnist,只要这个例子完全弄懂了,其它的就是举一反三的事了.由于篇幅原因,本文不具体介绍配置文件里面每个参数的具体函义,如果想弄明白的,请参看我以前的博文: 数据层及参数 ...

  3. 微博公众平台(二)-- Token验证代码

    Token,验证逻辑:1.将Token.timestamp.nonce放入数组 2.将数组从小到大排列 3.将数组按顺序拼装成一个字符串 4.对生成的字符串进行SHA1加密 5.将密文转换为小写 6. ...

  4. 基于SuperSocket的IIS主动推送消息给android客户端

    在上一篇文章<基于mina框架的GPS设备与服务器之间的交互>中,提到之前一直使用superwebsocket框架做为IIS和APP通信的媒介,经常出现无法通信的问题,必须一天几次的手动回 ...

  5. 【Python】[面性对象编程] 获取对象信息,实例属性和类属性

    获取对象信息1.使用isinstance()判断class类型2.dir() 返回一个对象的所有属性和方法3.如果试图获取不存在的对象会抛出异常[AttributeError]4.正确利用对象内置函数 ...

  6. 安裝 14.04.1 Ubuntu 到 Lenovo thinkpad t460p

    在 Lenovo Thinkpad T460p 安裝 ubuntu, BIOS 需要做一些設定, 沒設定的現象:不斷地停在 usb disk 設定 可以 使用 usb disk install 了!

  7. 在php中验证复选框

    PHP接收多个同名复选框信息不像ASP那样自动转换成为数组,这给使用带来了一定不便.但是还是有解决办法的,就是利用javascript做一下预处理.多个同名复选框在javascript中还是以数组的形 ...

  8. Python删除指定时间的文件

    import os import time import sys from xml.dom import minidom, Node from xml.dom.minidom import parse ...

  9. 使用Maven Assembly plugin将依赖打包进jar

    一个Eclipse的工程,在pom中配置了若干依赖,需要将pom中所有的依赖全部打包进一个jar包中,可以选择的方案有maven-assembly-plugin和fatjar.以前采用fatjar进行 ...

  10. 对于angularJS的一点思考

    已经找好工作近两周了,入职基本上还算顺利,自己两年来的挑灯夜战也算是有了收获,于是这两周基本上是按部就班的工作,没有学习什么新技术.在上个公司的时候,同事在项目中使用angularJs,之前他也没有接 ...