Angular2 - Starter - Directives
Angular2的视图是动态的,在不修改绑定到UI上的源数据的情况下,我们可以通过指令来改变数据的是否呈现,呈现形式,呈现样式。
(1).Angular2提供的最常用的指令是:
1.*ngIf='expression',通过expression的运算结果加载或者写在当前元素.
<h6 class="bg-success person-info-panel" *ngIf="selectedPerson !== null && utilities.isNotEmptyStr(selectedPerson.name)"> {{selectedPerson.name}},{{selectedPerson.phone}} </h6>
2.*ngFor='expression and declarations' 循环输入的数组,根据每个成员的数据加载渲染模板为视图
<li class="person-info-panel" *ngFor="let person of availablePeople;let i = index"> <a devide-age-group [birthDay]="person.birthDay" (click)="updateSeletedPerson(person)">
{{person.name}},{{person.email}},{{person.phone | tailNumberLength:5}},{{person.birthDay}}
</a> </li>
3.[ng-switch]='expression' 根据expression结果的不同case,加载不同的模板
<div [ng-switch]="conditionExpression"> <template [ng-switch-when]="case1">case1</template> <template [ng-switch-when]="case1">case2</template> <template [ng-switch-default]>default</template> </div>
(2) 自定义指令,如下我们来自定义一个根据输入的不同的生日来划分年龄段,并以不同的样式呈现用户信息的指令devide-age-group
//age-group.service import { Injectable } from '@angular/core'; @Injectable() export class AgeGroupSvc{ constructor(){} //该服务根据输入的生日返回不同的年龄组类别 getAgeByBirth(birthDay:Date){ let todayYear = (new Date()).getUTCFullYear(); let birthYear = birthDay.getUTCFullYear(); let age = todayYear - birthYear; return age; } getAgeGroupByBirth(birthDay:Date){ let age = this.getAgeByBirth(birthDay); if(age < 18){ return 1; }else if(age >= 18 && age < 25){ return 2; }else if(age >= 25 && age < 50){ return 3; }else{ return 4; } } }
import { Directive,SimpleChanges, ElementRef, Renderer,Input,OnChanges,OnInit,DoCheck} from '@angular/core'; import { AgeGroupSvc } from './age' import set = Reflect.set; @Directive({ /* 可用的选择器包括 'a[directiveName]';只对a标签且有directiveName属性的元素执行该指令; 'directiveName';对<directiveName></directiveName>这样的元素执行该指令; '[diractiveName]';对所有具有directiveName属性的元素执行该指令; */ selector: '[devide-age-group]', // 定义css选择器为属性选择 providers:[ //AgeGroupSvc作为一个服务,需申明为一个提供商 AgeGroupSvc ] }) export class AgeGroupDevideDiretive implements OnInit{ ngOnInit(): void { } element:ElementRef; _ageGroupSvc:AgeGroupSvc; //接收到输入的生日时,通过age-group 服务得到年龄组类别,根据不同的类别为显示用户信息的元素设置不同的样式 @Input('birthDay') set setBirthDay(birthDay:Date){ let targetColor = 'white'; let _birthDay = new Date(birthDay); if(_birthDay instanceof Date){ let ageGroup = this._ageGroupSvc.getAgeGroupByBirth(_birthDay); switch(ageGroup){ case 1: targetColor = 'red'; break; case 2: this.element.nativeElement.style.color = 'black'; targetColor = 'yellow'; break; case 3: targetColor = 'green'; break; case 4: targetColor = 'blue'; break; default:break; } } this.element.nativeElement.style.backgroundColor = targetColor; } constructor(element: ElementRef, renderer: Renderer, ageGroupSvc:AgeGroupSvc) { this.element = element; this._ageGroupSvc = ageGroupSvc; // `nativeElement` is the direct reference to the DOM element element.nativeElement.style.color = 'white'; } } @NgModule({ bootstrap: [ AppComponent ], declarations: [ //在应用module中引入AgeGroupDevideDiretive AgeGroupDevideDiretive ] })
//devide-age-group以属性的方式引入,angular在当前元素的渲染的最后一步就是对该元素执行devide-age-group 指令 <a devide-age-group [birthDay]="person.birthDay" (click)="updateSeletedPerson(person)"> {{person.name}},{{person.email}},{{person.phone | tailNumberLength:5}},{{person.birthDay}} </a>