Angular2 之 结构型指令
Angular 有一个强力的模板引擎,它能让你轻松维护元素的DOM树结构。 Angular指令可分为三种
组件组件其实就是一个带模板的指令。是这三种指令中最常用的,我们会编写大量的组件来构建application。 属性型指令属性型指令会修改元素的外观或者行为。 e.g. NgStyle可以修改元素的好几个样式。 结构型指令结构型指令通过添加和删除 DOM 元素来改变DOM的布局。 我们经常看到的内置的结构型指令有:ngIf、ngSwitch、ngFor。 下面我们着重介绍ngIf。 NgIf案例分析该指令接受一个布尔值,并据此让一整块DOM树出现或者消失。 注意:这里是出现或者消失,并不是隐藏。 隐藏元素的利弊
移除元素组件
总结基于上面的利弊分析,无论是我们在使用内置的指令还是使用自定的指令的时候,我们应该自己分析提添加、移除元素以及创建和销毁组件的后果。 标签
我们可以通过把短语”Hip! Hip! Hooray!”中间的”hip”包在一个标签中来验证下这个效果。 <p>
Hip!
</p>
<template>
<p>
Hip!
</p>
</template>
<p>
Hooray!
</p>
这时候显示的内容是’Hip! Hooray!’,在Angular的控制下,DOM的效果是不同的。 显然,Angular把标签及其内容替换成了一个空白 自定义指令我们自顶一个类似 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 —— 无论是写还是读。
<!-- 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)。 它把段落及其内容移到了
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>
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |