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 相关文章推荐
FCK调用方法..
Dec 21 Javascript
让input框实现类似百度的搜索提示(基于jquery事件监听)
Jan 31 Javascript
jQuery Easyui实现左右布局
Jan 26 Javascript
Bootstrap按钮下拉菜单组件详解
May 10 Javascript
全面解析node 表单的图片上传
Nov 21 Javascript
js cookie实现记住密码功能
Jan 17 Javascript
原生JS实现动态加载js文件并在加载成功后执行回调函数的方法
Dec 30 Javascript
详解vue路由篇(动态路由、路由嵌套)
Jan 27 Javascript
js前端面试之同步与异步问题详解
Apr 03 Javascript
Vue事件修饰符native、self示例详解
Jul 09 Javascript
vue之封装多个组件调用同一接口的案例
Aug 11 Javascript
Javascript实现单选框效果
Dec 09 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和XSL stylesheets转换XML文档
2006/10/09 PHP
基于xcache的配置与使用详解
2013/06/18 PHP
php中mkdir函数用法实例分析
2014/11/15 PHP
php压缩和解压缩字符串的方法
2015/03/14 PHP
详解WordPress中用于合成数组的wp_parse_args()函数
2015/12/18 PHP
PHP ADODB生成HTML表格函数rs2html功能【附错误处理函数用法】
2018/05/29 PHP
js 学习笔记(三)
2009/12/29 Javascript
解决火狐浏览器下JS setTimeout函数不兼容失效不执行的方法
2012/11/14 Javascript
jquery prop的使用介绍及与attr的区别
2013/12/19 Javascript
js实现select下拉框菜单
2015/12/08 Javascript
JS实现的模仿QQ头像资料卡显示与隐藏效果
2017/04/07 Javascript
jQuery UI Draggable + Sortable 结合使用(实例讲解)
2017/09/07 jQuery
jquery实现回车键触发事件(实例讲解)
2017/11/21 jQuery
vue.js 实现点击按钮动态添加li的方法
2018/09/07 Javascript
angular6 填坑之sdk的方法
2018/12/27 Javascript
Vue项目引发的「过滤器」使用教程
2019/03/12 Javascript
微信小程序 image组件遇到的问题
2019/05/28 Javascript
layui 地区三级联动 form select 渲染的实例
2019/09/27 Javascript
详解Angular Karma测试的持续集成实践
2019/11/15 Javascript
使用Bootstrap做一个朝代历史表
2019/12/10 Javascript
vue 二维码长按保存和复制内容操作
2020/09/22 Javascript
vue二选一tab栏切换新做法实现
2021/01/19 Vue.js
Python实现监控程序执行时间并将其写入日志的方法
2015/06/30 Python
Python 实现 贪吃蛇大作战 代码分享
2016/09/07 Python
利用Python进行数据可视化常见的9种方法!超实用!
2018/07/11 Python
Python实现九宫格式的朋友圈功能内附“马云”朋友圈
2019/05/07 Python
django框架中间件原理与用法详解
2019/12/10 Python
python+requests接口自动化框架的实现
2020/08/31 Python
CSS3的新特性介绍
2008/10/31 HTML / CSS
JACK & JONES瑞典官方网站:杰克琼斯欧式风格男装
2017/12/23 全球购物
戴尔荷兰官方网站:Dell荷兰
2020/10/04 全球购物
团员个人的自我评价
2013/12/02 职场文书
2014年大学生党员自我评议
2014/09/22 职场文书
无罪辩护词范文
2015/05/21 职场文书
《普罗米修斯》教学反思
2016/02/22 职场文书
优秀共产党员事迹材料2016
2016/02/29 职场文书