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 相关文章推荐
网页里控制图片大小的相关代码
Jun 13 Javascript
ExtJS 学习专题(一) 如何应用ExtJS(附实例)
Mar 11 Javascript
动态加载图片路径 保持JavaScript控件的相对独立性
Sep 03 Javascript
javascript实现div的显示和隐藏的小例子
Jun 25 Javascript
浅谈JSON中stringify 函数、toJosn函数和parse函数
Jan 26 Javascript
JavaScript通过join函数连接数组里所有元素的方法
Mar 20 Javascript
Underscore之Array_动力节点Java学院整理
Jul 10 Javascript
jQuery实现通过方向键控制div块上下左右移动的方法【测试可用】
Apr 26 jQuery
JavaScript 自定义html元素鼠标右键菜单功能
Dec 02 Javascript
详解JavaScript自定义函数
Jul 29 Javascript
vue使用svg文件补充-svg放大缩小操作(使用d3.js)
Sep 22 Javascript
JS模拟实现京东快递单号查询
Nov 30 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 中的类
2006/10/09 PHP
window+nginx+php环境配置 附配置搭配说明
2010/12/29 PHP
PHP设置一边执行一边输出结果的代码
2013/09/30 PHP
php实现斐波那契数列的简单写法
2014/07/19 PHP
php删除txt文件指定行及按行读取txt文档数据的方法
2017/01/30 PHP
对于Laravel 5.5核心架构的深入理解
2018/02/22 PHP
php数组指针函数功能及用法示例
2020/02/11 PHP
使用自定义setTimeout和setInterval使之可以传递参数和对象参数
2009/04/24 Javascript
解决jquery submit()提交表单提示:f[s] is not a function
2013/01/23 Javascript
javaScript对文字按照拼音排序实现代码
2013/12/27 Javascript
vue.js初学入门教程(2)
2016/11/07 Javascript
JS前向后瞻正则表达式定义与用法示例
2016/12/27 Javascript
用node和express连接mysql实现登录注册的实现代码
2017/07/05 Javascript
jquery radio 动态控制选中失效问题的解决方法
2018/02/28 jQuery
vue-cli3.0 特性解读
2018/04/22 Javascript
详解vue-router 命名路由和命名视图
2018/06/01 Javascript
vue中使用protobuf的过程记录
2018/10/26 Javascript
es6函数之尾递归用法实例分析
2020/04/25 Javascript
vue实现简单全选和反选功能
2020/09/15 Javascript
Python的Flask框架应用程序实现使用QQ账号登录的方法
2016/06/07 Python
Python单元测试简单示例
2018/07/03 Python
Python生成验证码、计算具体日期是一年中的第几天实例代码详解
2019/10/16 Python
Python 静态方法和类方法实例分析
2019/11/21 Python
python 命名规范知识点汇总
2020/02/14 Python
Python进程的通信Queue、Pipe实例分析
2020/03/30 Python
python操作ini类型配置文件的实例教程
2020/10/30 Python
Pytorch之扩充tensor的操作
2021/03/04 Python
Kiwi.com中国:找到特价机票并发现新目的地
2019/10/27 全球购物
环境监测与治理技术专业求职信
2014/07/06 职场文书
学习礼仪心得体会
2014/09/01 职场文书
2014年教育工作总结
2014/11/26 职场文书
试用期自我评价怎么写
2015/03/10 职场文书
博士论文答辩开场白
2015/06/01 职场文书
教您:房贷工资收入证明应该怎么写?
2019/08/19 职场文书
idea下配置tomcat避坑详解
2022/04/12 Servers
Win11 Build 25179预览版发布(附更新内容+ISO官方镜像下载)
2022/08/14 数码科技