详解Angular2 之 结构型指令


Posted in Javascript onJune 21, 2017

Angular 有一个强力的模板引擎,它能让你轻松维护元素的DOM树结构。

Angular指令可分为三种

  1. 组件
  2. 属性型指令
  3. 结构型指令

组件

组件其实就是一个带模板的指令。是这三种指令中最常用的,我们会编写大量的组件来构建application。

属性型指令

属性型指令会修改元素的外观或者行为。 e.g. NgStyle可以修改元素的好几个样式。

结构型指令

结构型指令通过添加和删除 DOM 元素来改变DOM的布局。

我们经常看到的内置的结构型指令有:ngIf、ngSwitch、ngFor。

下面我们着重介绍ngIf。

NgIf案例分析

该指令接受一个布尔值,并据此让一整块DOM树出现或者消失。

注意:这里是出现或者消失,并不是隐藏。

隐藏元素的利弊

当我们隐藏元素时,组件的行为还在继续。

它仍然附加子啊它所属于的DOM元素上,它仍然在监听事件。angular会继续检查哪些能影响数据绑定的变更。组件原本要做的哪些事情仍然在进行!它还是占用着那么多的资源。

另外一方面,重新显示这个组件会很快。

组件以前的状态被保留着,并随时可以显示。组件不用重新初始化,当然,该操作付出代价比较大!

移除元素组件


把ngIf设置为false,将会影响到组件的资源消耗。angular会从DOM中移除该元素,停止相关组件的变更检测,把它从DOM事件中移除,并且销毁组件。组件会被垃圾回收,并释放内存。


如果我们很快再次使用这个组件的时候,重建组件的代价是非常大的。

当ngIf重新变成true的时候,angular会重新创建该组件及其子树。angular会重新运行每个组件的初始化逻辑。

总结

基于上面的利弊分析,无论是我们在使用内置的指令还是使用自定的指令的时候,我们应该自己分析提添加、移除元素以及创建和销毁组件的后果。

标签

在Angular应用之外,标签的默认CSS属性display是none。 它的内容存在于一个隐藏的文档片段中。
而在Angular应用中,Angular会移除 标签及其子元素。

我们可以通过把短语”Hip! Hip! Hooray!”中间的”hip”包在一个标签中来验证下这个效果。

<p>
 Hip!
</p>
<template>
 <p>
  Hip!
 </p>
</template>
<p>
 Hooray!
</p>

这时候显示的内容是'Hip! Hooray!',在Angular的控制下,DOM的效果是不同的。

详解Angular2 之 结构型指令

显然,Angular把标签及其内容替换成了一个空白

自定义指令

我们自顶一个类似ngIf的指令。

import { Directive, Input } from '@angular/core';
import { TemplateRef, ViewContainerRef } from '@angular/core';

/** 选中器[],是匹配页面上的指令,可以有多个名称,由于是自己的指令,所以没有使用ng开头 */
@Directive({ selector: '[myUnless]' })
export class UnlessDirective {
 /**
  * 我们需要访问模板,并且还需要一个渲染器来渲染它的内容。
  * 我们通过TemplateRef来访问模板。渲染器是ViewContainerRef。
  * 我们把它们都作为私有变量注入到构造函数中。
  */
 constructor(
  private templateRef: TemplateRef<any>,
  private viewContainer: ViewContainerRef
  ) { }

 /**
  * 如果条件为假,我们就渲染模板,否则就清空元素内容。
  * 我们现在先把myUnless属性定义成一个“只写”属性。
  */
 @Input() set myUnless(condition: boolean) {
  if (!condition) {
   this.viewContainer.createEmbeddedView(this.templateRef);
  } else {
   this.viewContainer.clear();
  }
 }
}

几个概念

星号(*)效果

这个星号是一种“语法糖”。它简化了ngIf和ngFor —— 无论是写还是读。

ngIf

接下来这两个ngIf范例的效果完全相同,只是我们写成了另一种风格:

<!-- Examples (A) and (B) are the same -->
<!-- (A) *ngIf paragraph -->
<p *ngIf="condition">
 Our heroes are true!
</p>

<!-- (B) [ngIf] with template -->
<template [ngIf]="condition">
 <p>
  Our heroes are true!
 </p>
</template>

要知道,Angular会把风格(A)写成风格(B)。 它把段落及其内容移到了 标签中。 它把指令移到了 标签上,成为该标签的一个属性绑定 —— 包装在方括号中。 宿主组件的condition 属性的布尔值决定该模板的内容是否应该被显示。

ngFor

Angular把*ngFor转换成一个类似的形式:

<!-- Examples (A) and (B) are the same -->

<!-- (A) *ngFor div -->
<div *ngFor="let hero of heroes">{{ hero }}</div>

<!-- (B) ngFor with template -->
<template ngFor let-hero [ngForOf]="heroes">
 <div>{{ hero }}</div>
</template>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript 存在陷阱 删除某一区域所有节点
May 10 Javascript
jquery 操作表格实现代码(多种操作打包)
Mar 20 Javascript
javascript避免数字计算精度误差的方法详解
Mar 05 Javascript
详解JavaScript对象和数组
Dec 03 Javascript
分享javascript实现的冒泡排序代码并优化
Jun 05 Javascript
Js+Ajax,Get和Post在使用上的区别小结
Jun 08 Javascript
同步异步动态引入js文件的几种方法总结
Sep 23 Javascript
three.js实现围绕某物体旋转
Jan 25 Javascript
如何用JS/HTML将时间戳转换为“xx天前”的形式
Feb 06 Javascript
详解Vue2.x-directive的学习笔记
Jul 17 Javascript
VUE页面中加载外部HTML的示例代码
Sep 20 Javascript
JavaScript面向对象编程小游戏---贪吃蛇代码实例
May 15 Javascript
JavaScript用200行代码制作打飞机小游戏实例
Jun 21 #Javascript
Angular.JS中指令ng-if的注意事项小结
Jun 21 #Javascript
jquery.validate表单验证插件使用详解
Jun 21 #jQuery
JS实现简单拖拽效果
Jun 21 #Javascript
详解Vue路由开启keep-alive时的注意点
Jun 20 #Javascript
jquery基于layui实现二级联动下拉选择(省份城市选择)
Jun 20 #jQuery
详解Node.js access_token的获取、存储及更新
Jun 20 #Javascript
You might like
隐性调用php程序的方法
2009/03/09 PHP
PHP编程实现阳历转换为阴历的方法实例
2017/08/08 PHP
thinkPHP+LayUI 流加载实现功能
2019/09/27 PHP
用javascript实现计算两个日期的间隔天数
2007/08/14 Javascript
判断在css加载完毕后执行后续代码示例
2014/09/03 Javascript
javascript实现在网页任意处点左键弹出隐藏菜单的方法
2015/05/13 Javascript
js判断当前页面在移动设备还是在PC端中打开
2016/01/06 Javascript
js HTML5 Ajax实现文件上传进度条功能
2016/02/13 Javascript
Bootstrap模态框(Modal)实现过渡效果
2017/03/17 Javascript
解决vue router使用 history 模式刷新后404问题
2017/07/19 Javascript
jQuery ajax仿Google自动提示SearchSuggess功能示例
2019/03/28 jQuery
封装微信小程序http拦截器过程解析
2019/08/13 Javascript
vue组件命名和props命名代码详解
2019/09/01 Javascript
vue中如何添加百度统计代码
2020/12/19 Vue.js
[03:08]Ti4观战指南上
2014/07/07 DOTA
python之从文件读取数据到list的实例讲解
2018/04/19 Python
浅析python继承与多重继承
2018/09/13 Python
Python跑循环时内存泄露的解决方法
2020/01/13 Python
完美解决jupyter由于无法import新包的问题
2020/05/26 Python
Python必须了解的35个关键词
2020/07/16 Python
python实现AHP算法的方法实例(层次分析法)
2020/09/09 Python
全网最详细的PyCharm+Anaconda的安装过程图解
2021/01/25 Python
哥德堡通行证:Gothenburg Pass
2019/12/09 全球购物
上班玩手机检讨书
2014/02/17 职场文书
《学会待客》教学反思
2014/02/22 职场文书
活动策划求职信模板
2014/04/21 职场文书
检察机关个人对照检查材料
2014/09/15 职场文书
2014年重阳节老干部座谈会上的讲话稿
2014/09/25 职场文书
春秋淹城导游词
2015/02/11 职场文书
2015年12.4全国法制宣传日活动总结
2015/03/24 职场文书
通知函格式范文
2015/04/27 职场文书
2015年财务部年度工作总结
2015/05/19 职场文书
七年级作文之《我和我的祖国》观后感作文
2019/10/18 职场文书
Python Django ORM连表正反操作技巧
2021/06/13 Python
Python并发编程实例教程之线程的玩法
2021/06/20 Python
MYSQL如何查看进程和kill进程
2022/03/13 MySQL