Angular2之结构型指令的示例分析
这篇文章主要介绍了Angular2之结构型指令的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
Angular 有一个强力的模板引擎,它能让你轻松维护元素的DOM树结构。
Angular指令可分为三种
组件
属性型指令
结构型指令
组件
组件其实就是一个带模板的指令。是这三种指令中最常用的,我们会编写大量的组件来构建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的效果是不同的。
显然,Angular把标签及其内容替换成了一个空白
自定义指令
我们自顶一个类似ngIf的指令。
import { Directive, Input } from '@angular/core';
import { TemplateRef, ViewContainerRef } from '@angular/core';
@Directive({ selector: '[myUnless]' })
export class UnlessDirective {
constructor(
private templateRef: TemplateRef<any>,
private viewContainer: ViewContainerRef
) { }
@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>
感谢你能够认真阅读完这篇文章,希望小编分享的“Angular2之结构型指令的示例分析”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网行业资讯频道,更多相关知识等着你来学习!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341