在 Angular 中有三种类型的指令:
- 组件 — 拥有模板的指令
- 结构型指令 — 通过添加和移除 DOM 元素改变 DOM 布局的指令 eg: NgFor 和 NgIf。
- 属性型指令 — 改变元素、组件或其它指令的外观和行为的指令。 eg: NgStyle
注:
在一个宿主元素上可以使用多个属性型指令,但只能使用一个结构型指令
属性型: [prop], 结构型: *direct, *被angular解开为<ng-template></ng-template>
一.属性型指令
1. 内置属性性指令
(1)
单个class: [class.样式名]='布尔值'
一组class: [ngClass] = {(1)哈希值}
currentClasses:{};
setCurrentClasses(){
this.currentClasses={
'saveable':this.canSave,
'modified':!this.isUnchanged,
'special':this.isSpecial
};
}
模板:<div
[ngClass]="currentClasses">special</div>
(2)
单个内置样式:[style.font-size]="isSpecial
? 'x-large' : 'smaller'"
一组内置样式:
同上,模板为
<div [ngStyle]="currentStyles"></div>
(3)
ngModel双向数据 ,需要引入 FormsModule
<input
[(ngModel)]="currentHero.name">
2. 自定义属性型指令
模板:<p
[appHighlight]="color">Highlight
me!</p>
二. 结构型指令
1. 内置结构型指令
(2)<div
*ngFor="let
hero of heroes">{{hero.name}}</div>
(3)tractBy:只有发生变化才更新,未发生变化的数据不会进行更新(不用,会全部数据进行刷新,不管其是否发生变更)
模板:<div
*ngFor="let
hero of heroes; trackBy: trackByHeroes">
({{hero.id}}) {{hero.name}}</div>
controller:trackByHeroes(index:
number,
hero:Hero):
number {return
hero.id;}
(4)<div
[ngSwitch]="currentHero.emotion">
<app-happy-hero
*ngSwitchCase="'happy'"
[hero]="currentHero"></app-happy-hero>
</div>
(5) 模板输入变量(let hero ofheroes; let i=index;)与模板引用变量(#val)的区别:
模板输入变量:作用于在元素整个循环中,循环结束则释放,不可在其他地方进行引用
模板引用变量:代表当前元素,可在模板的任何地方引用此元素,作用于整个模板。
注:结构型容器有<ng-container>或者<div>,尽量不添加无意义的元素,当没有合适的容器元素时,可以使用
<ng-container>对元素进行分组。<ng-container>是一个分组元素,不会影响样式或布局。2.
自定义结构型指令
(1)模板:<p
*appUnless="condition">false
show</p>
三. 组件:带模板的指令