Angular 4.0学习教程之架构详解


Posted in Javascript onSeptember 12, 2017

前言

前段时间谷歌发布了广受欢迎的Angular JavaScript框架的4.0版本,该版本致力于缩小生成代码的体积,以及保持框架的简化发布计划。

很久没写这种比较偏概念类的东西了,不过我觉得没有形成一个知识架构,学习效率会大打折扣。在这里把我的所理解的知识分享给大家,部分内容引用自官方文档。下面进入主题

Angular架构概览

先来看一下官方放出的架构图。

Angular 4.0学习教程之架构详解
架构概览

这个架构图展现了 Angular 应用中的 8 个主要构造块:

  • 模块 (module)
  • 组件 (component)
  • 模板 (template)
  • 元数据 (metadata)
  • 数据绑定 (data binding)
  • 指令 (directive)
  • 服务 (service)
  • 依赖注入 (dependency injection)

接下来我按顺序并结合图来讲解一下。

1.模块 (module)

Angular 或者 ionic 新建的项目,都会存在一个根模块,默认名是 AppModule。如果你使用了模块化来创建应用,包括 AppModule,每个都会存在一个 @NgModule 装饰器的类(虽然他很像 java 中的注解,但是他的官方命名叫装饰器)。我们新建的页面,如果不使用懒加载,都要在 @NgModule 中先声明后使用。

下面举个例子,简单介绍一下 @NgModule 中的内容

//app.module.ts

import { NgModule }  from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
@NgModule({
 imports:  [ BrowserModule ],
 providers: [ Logger ],
 declarations: [ AppComponent ],
 exports:  [ AppComponent ],
 bootstrap: [ AppComponent ]
})
export class AppModule { }
  • imports 本模块声明的组件模板需要的类所在的其它模块。
  • providers 服务的创建者,并加入到全局服务列表中,可用于应用任何部分。
  • declarations 声明本模块中拥有的视图类。Angular 有三种视图类:组件、指令和管道。
  • exports declarations 的子集,可用于其它模块的组件模板。
  • bootstrap 指定应用的主视图(称为根组件),它是所有其它视图的宿主。只有根模块才能设置 bootstrap 属性。

在图中的意义:看图左上角,模块是用来接收一个用来描述模块属性元数据对象的。

2.组件 (component)、模板 (template)、元数据 (metadata)

这次我们把这三点一起来讲,先看一下这段代码

//hero-list.component.ts

@Component({
selector: 'hero-list',
templateUrl: './hero-list.component.html',
providers: [ HeroService ]
})
export class HeroListComponent implements OnInit {
/* . . . */
}

Component

组件是一个装饰器,他能接受一个配置对象, Angular 会基于这些信息创建和展示组件及其视图。

  • selector:CSS 选择器,它告诉 Angular 在父级 HTML 中查找 <hero-list> 标签,创建并插入该组件。
  • templateUrl:组件 HTML 模板的模块相对地址,如果使用 template 来写的话是用“`”这个符号来直接编写 HTML 代码。
  • providers:组件所需服务的依赖注入。

template

模板就是那段 HTML 代码,可以用 templateUrl 引入外面的,也可以用 template`` 直接写。

metadata

元数据装饰器用类似的方式来指导 Angular 的行为。 例如 @Input、@Output、@Injectable 等是一些最常用的装饰器,用法就不在这里展开了。

在图中的意义:看图中间那一块,模板、元数据和组件共同描绘出这个视图。

3.数据绑定 (data binding)

这里一共展示四种数据绑定,看一下示例代码:

//插值表达式 显示组件的hero.name属性的值
<li>{{hero.name}}</li>

//属性绑定 把父组件selectedHero的值传到子组件的hero属性中
<hero-detail [hero]="selectedHero"></hero-detail>

//事件绑定 用户点击英雄的名字时调用组件的selectHero方法
<li (click)="selectHero(hero)"></li>

//双向绑定 数据属性值通过属性绑定从组件流到输入框。用户的修改通过事件绑定流回组件,把属性值设置为最新的值
<input [(ngModel)]="hero.name">

可能大家对各种括号看的眼花了,总结一下:

  • 双花括号是单向绑定,传递的是值。方向是 组件 -> 模板。
  • 方括号是单向绑定,传递的是属性。方向是 父组件 -> 子组件。
  • 圆括号是事件绑定,处理点击等活动(action)。
  • 方括号套圆括号是双向绑定,方向是 组件 <-> 模板。

在图中的意义:看图中间那一块,数据绑定给模板和组件提供数据交互的方式。

4.指令 (directive)

严格来说组件就是一个指令,但是组件非常独特,并在 Angular 中位于中心地位,所以在架构概览中,我们把组件从指令中独立了出来。

我们这里提到的指令有两种类型:

结构型 structural 指令和属性 attribute 型指令。

放一下原文证明一下组件确实算是一个指令:

While a component is technically a directive, components are so distinctive and central to Angular applications that this architectural overview separates components from directives.

Two other kinds of directives exist: structural and attribute directives.

结构型指令是 ngFor、ngIf 这种的,通过在 DOM 中添加、移除和替换元素来修改布局。

属性型指令是 ngModel 这种的,用来修改一个现有元素的外观或行为。

Angular 还有少量指令,它们或者修改结构布局(例如 ngSwitch ), 或者修改 DOM 元素和组件的各个方面(例如 ngStyle 和 ngClass)。之后我会单独写一篇讲他们用法的文章。

在图中的意义:看图右上角那一块,组件是一个带模板的指令,只是扩展了一些面向模板的特性。

5.服务 (service)

官方文档的概念:

服务是一个广义范畴,包括:值、函数,或应用所需的特性。服务没有什么特别属于 Angular 的特性。Angular 对于服务也没有什么定义,它甚至都没有定义服务的基类,也没有地方注册一个服务。

这就像你在 iOS 或者 Android 里单独建了一个类叫 httpService ,封装了网络请求服务一样,不是具体的什么东西,就是一个概念了解下就行。

在图中的意义:看图左下角角那一块,服务是用来封装可重用的业务逻辑。

6.依赖注入 (dependency injection)

依赖注入是提供类的新实例的一种方式,还负责处理类所需的全部依赖。大多数依赖都是服务。 Angular 使用依赖注入来提供新组件以及组件所需的服务。

比如我们要给某组件导入 HomeService 这个服务,看这段代码:

constructor(private service: HeroService) { 
 ...
}

这个constructor就是构造函数,依赖注入在 constructor 中进行。你也许会觉得前面写上 private、public 之类的很怪,这是 TypeScript 语法比较特殊,习惯就好。

当 Angular 创建组件时,会首先为组件所需的服务请求一个注入器 injector。我们必须先用注入器 injector 为 HeroService 注册一个提供商 provider。

看一下下面的代码,意思就是我们必须在 providers 写上才能用

@Component({
 selector: 'hero-list',
 templateUrl: './hero-list.component.html',
 providers: [ HeroService ]
})

在图中的意义:看图左下角角那一块,依赖注入主要用来导入服务。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
探讨javascript是不是面向对象的语言
Nov 21 Javascript
Javascript 浮点运算精度问题分析与解决
Mar 26 Javascript
JavaScript中实现PHP的打乱数组函数shuffle实例
Oct 11 Javascript
在Javascript操作JSON对象,增加 删除 修改的简单实现
Jun 02 Javascript
layui文件上传实现代码
May 20 Javascript
提高Node.js性能的应用技巧分享
Aug 10 Javascript
Angular实现的内置过滤器orderBy排序与模糊查询功能示例
Dec 29 Javascript
详解react、redux、react-redux之间的关系
Apr 11 Javascript
微信小程序实现发红包功能
Jul 11 Javascript
Vue两个版本的区别和使用方法(更深层次了解)
Feb 16 Javascript
Node使用Nodemailer发送邮件的方法实现
Feb 24 Javascript
原生JS实现拖拽功能
Dec 16 Javascript
jQuery+vue.js实现的九宫格拼图游戏完整实例【附源码下载】
Sep 12 #jQuery
详解vue axios中文文档
Sep 12 #Javascript
javascript算法之二叉搜索树的示例代码
Sep 12 #Javascript
vue-resouce设置请求头的三种方法
Sep 12 #Javascript
vue params、query传参使用详解
Sep 12 #Javascript
Node.js中使用mongoose操作mongodb数据库的方法
Sep 12 #Javascript
vue proxyTable 接口跨域请求调试的示例
Sep 12 #Javascript
You might like
PHP 程序员应该使用的10个组件
2009/10/31 PHP
PHP 加密解密内部算法
2010/04/22 PHP
PHP第一季视频教程(李炎恢+php100 不断更新)
2011/05/29 PHP
PHP写的求多项式导数的函数代码
2012/07/04 PHP
PHP采集类snoopy详细介绍(snoopy使用教程)
2014/06/19 PHP
php邮箱地址正则表达式验证
2015/11/13 PHP
PHP类型约束用法示例
2016/09/28 PHP
php 微信开发获取用户信息如何实现
2016/12/13 PHP
PHP框架自动加载类文件原理详解
2017/06/06 PHP
PHP序列化和反序列化深度剖析实例讲解
2020/12/29 PHP
非常漂亮的JS代码经典广告
2007/10/21 Javascript
JavaScript 全角转半角部分
2009/10/28 Javascript
JavaScript 实现鼠标拖动元素实例代码
2014/02/24 Javascript
jQuery实现判断滚动条到底部
2015/06/23 Javascript
js判断复选框是否选中及选中个数的实现代码
2016/05/30 Javascript
使用RequireJS库加载JavaScript模块的实例教程
2016/06/06 Javascript
JavaScript中校验银行卡号的实现代码
2016/12/19 Javascript
jQuery点击头像上传并预览图片
2017/02/23 Javascript
jQuery动态移除与增加onclick属性的方法详解
2018/06/07 jQuery
解决layui弹框失效的问题
2019/09/09 Javascript
Js on及addEventListener原理用法区别解析
2020/07/11 Javascript
如何利用 JS 脚本实现网页全自动秒杀抢购功能
2020/10/12 Javascript
解决vant框架做H5时踩过的坑(下拉刷新、上拉加载等)
2020/11/11 Javascript
Python循环实现n的全排列功能
2019/09/16 Python
python3连接mysql获取ansible动态inventory脚本
2020/01/19 Python
Python利用 utf-8-sig 编码格式解决写入 csv 文件乱码问题
2020/02/21 Python
python小白切忌乱用表达式
2020/05/29 Python
Python 中 sorted 如何自定义比较逻辑
2021/02/02 Python
REN Clean Skincare官网:英国本土有机护肤品牌
2019/02/23 全球购物
幼儿师范毕业生自荐信
2013/11/09 职场文书
自我评价怎么写好呢?
2013/12/05 职场文书
《跨越百年的美丽》教学反思
2014/02/11 职场文书
领导党性分析材料
2014/02/15 职场文书
未受刑事制裁公证证明
2014/09/20 职场文书
诺贝尔奖获得者名言100句:句句启人心智,值永久收藏
2019/08/09 职场文书
Oracle删除归档日志及添加定时任务
2022/06/28 Oracle