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+iframe 实现无刷新载入整页的代码
Mar 17 Javascript
jQuery的live()方法对hover事件的处理示例
Feb 27 Javascript
jquery自定义下拉列表示例
Apr 25 Javascript
jQuery1.9.1针对checkbox的调整方法(prop)
May 01 Javascript
jquery实现兼容IE8的异步上传文件
Jun 15 Javascript
js实现超简单的展开、折叠目录代码
Aug 28 Javascript
浅谈js多维数组和hash数组定义和使用
Jul 27 Javascript
JavaScript中Promise的使用详解
Feb 26 Javascript
js实现随机点名小功能
Aug 17 Javascript
浅谈JavaScript 代码整洁之道
Oct 23 Javascript
基于iview-admin实现动态路由的示例代码
Oct 02 Javascript
vue + node如何通过一个Txt文件批量生成MP3并压缩成Zip
Jun 02 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中经典方法实现判断多维数组是否为空
2011/10/23 PHP
PHP操作文件的一些基本函数使用示例
2014/11/18 PHP
让你的PHP7更快之Hugepage用法分析
2016/05/31 PHP
laravel5.0在linux下解决.htaccess无效和去除index.php的问题
2019/10/16 PHP
用javascript实现点击链接弹出&quot;图片另存为&quot;而不是直接打开
2007/08/15 Javascript
JS实现兼容性好,自动置顶的淘宝悬浮工具栏效果
2015/09/18 Javascript
谈谈JavaScript自定义回调函数
2015/10/18 Javascript
基于JavaScript实现网页倒计时自动跳转代码
2015/12/28 Javascript
无阻塞加载js,防止因js加载不了影响页面显示的问题
2016/12/18 Javascript
JavaScript基本语法_动力节点Java学院整理
2017/06/26 Javascript
Angularjs上传图片实例详解
2017/08/06 Javascript
微信小程序使用checkbox显示多项选择框功能【附源码下载】
2017/12/11 Javascript
vue 解决循环引用组件报错的问题
2018/09/06 Javascript
总结javascript三元运算符知识点
2018/09/28 Javascript
js中事件对象和事件委托的介绍
2019/01/21 Javascript
微信小程序 setData 对 data数据影响问题
2019/04/18 Javascript
微信小程序实现电子签名功能
2020/07/29 Javascript
vue prop传值类型检验方式
2020/07/30 Javascript
详解Howler.js Web音频播放终极解决方案
2020/08/23 Javascript
我所理解的JavaScript中的this指向
2020/09/04 Javascript
Nodejs在局域网配置https访问的实现方法
2020/10/17 NodeJs
Python中字典创建、遍历、添加等实用操作技巧合集
2015/06/02 Python
python友情链接检查方法
2015/07/08 Python
在Python的Django框架中获取单个对象数据的简单方法
2015/07/17 Python
一个基于flask的web应用诞生 组织结构调整(7)
2017/04/11 Python
python读取与写入csv格式文件的示例代码
2017/12/16 Python
Django Xadmin多对多字段过滤实例
2020/04/07 Python
详解三种方式实现平滑滚动页面到顶部的功能
2019/04/23 HTML / CSS
UGG雪地靴荷兰官网:UGG荷兰
2016/09/09 全球购物
Shopee印度尼西亚:东南亚与台湾市场最大电商平台
2018/06/17 全球购物
英国排名第一的停车场运营商:NCP
2019/08/26 全球购物
社会学专业求职信
2014/07/17 职场文书
2014年财务部工作总结
2014/11/11 职场文书
2015教师节通讯稿
2015/07/20 职场文书
星际争霸 Light vs Action 一场把教主看到鬼畜的比赛
2022/04/01 星际争霸
Go结合Gin导出Mysql数据到Excel表格
2022/08/05 Golang