Angular中的數據綁定指的是同一組件中控制器文件(.ts)與視圖文件(.html)之間的數據傳遞。html
它的意思是要麼是ts文件爲html文件賦值,要麼相反。java
ts->html編程
<div> <img src="{{imgUrl}}"> <img [src]="imgUrl"> </div>
html->tssegmentfault
<input (keyup)="press($event)">
小結:ts->html使用插值表達式{{value}}
或[attr]
,html->ts使用(event)
。ts->html較爲經常使用。數組
ts文件與html文件中綁定的值同時改變。app
下列代碼表示當HTML文件輸入框內容改變時,ts文件的屬性name的值同時改變。dom
<input [(ngModel)]="name">
它的做用等於:字體
htmlthis
<input [value]="name" (input)="doOnInput($event)">
tsspa
doOnInput(event: any) { this.name = event.target.value; }
首先看看Dom屬性和HTML屬性的關係:
<!--Dom屬性綁定--> <input value="Yan" (input)="doOnInput($event)">
上面已經提到,colspan
沒有對應的Dom屬性,只能使用HTML屬性綁定:
<!--html屬性綁定--> <table border="solid"> <tr> <!-- 如下表達式會報錯:colspan不是td的屬性 <td [colspan]="colspanSize">hello</td> --> <td [attr.colspan]="colspanSize" align="center">hello</td> </tr> <tr> <td>嘻嘻</td> <td>哈哈</td> </tr> </table>
protected colspanSize: number = 2;
<!--單一類的控制--> <div class="a b" [class.c]="isBig">斷定是否有c類:{{isBig}}</div> <!--多個類的控制--> <div [ngClass]="divClasses">是否有類a:{{divClasses.a}}、b:{{divClasses.b}}和c:{{divClasses.c}}</div> <!--如下兩種方式效果相同,均爲divClass的值'fontRedClass'--> <div [class]="divClass">紅色字體</div> <div class="{{divClass}}">紅色字體</div>
protected divClass = 'fontRedClass'; protected divClasses: any = { a: Math.random() < 0.5, b: Math.random() < 0.5, c: Math.random() < 0.5 };
.fontRedClass { color:red; } .a { background: yellowgreen; } .b { font-family: 華文隸書; } .c { font-size: 20px; }
<!--單同樣式綁定--> <div [style.color]="isRed?'red':'green'">單同樣式綁定</div> <!--多個樣式綁定--> <div [ngStyle]="divStyles">多個樣式綁定</div>
protected isRed = Math.random() < 0.5; protected divStyles: any = { color: 'red', background: 'yellowgreen' };
響應式編程主要是經過觀察者模式實現,在Angular中的Rxjs便是它的具體實現,它們的關係以下:
在Rxjs中,觀察者模式的基本實現以下:
Observable
相似於java中的Stream
。
上圖只是簡單的數組流,實際上,萬物皆可用流處理,好比頁面上的按鈕點擊事件:
import {Observable} from 'rxjs/'; let button = document.querySelector('button'); Observable.fromEvent(button,'click');
使用formControl來監聽輸入的值,並用流的方式處理(打印):
<!--響應式編程--> <input [formControl]="formControl">
注意:要使用[formControl]須要在app.module.ts中引入模塊ReactiveFormsModule
。
import {FormControl} from '@angular/forms'; protected formControl: FormControl = new FormControl(); constructor() { this.formControl.valueChanges .debounceTime(500).subscribe(bookname => this.print(bookname)); }
模板變量是在html標籤上使用#開頭來定義的變量,它表明html元素自己。
<input (keyup)="onKeyUp($event)"> <input #iValue (keyup)="onKeyUp(iValue.value)">
onKeyUp(param: any) { let iInput; try { iInput = param.target.value; } catch (e) { iInput = param; } console.log(iInput); }
管道是用來對輸入的數據進行處理,如大小寫轉換、數值和日期格式化等。
基礎知識再也不贅述,請看推薦博客:
Demo:
ng g component pipe
<p>個人生日是:{{birthday | date:'yyyy-MM-dd'}}</p> <p>個人名字是:{{name | uppercase}}</p> <p>個人存款是:{{deposit | number:'2.2-2'}}萬</p>
protected birthday:Date = new Date(1989,1,19); protected name:string = 'Vito'; protected deposit:number = 1.23456;
age
:ng g pipe pipe/age
import { Pipe, PipeTransform } from '@angular/core'; @Pipe({ name: 'age' }) export class AgePipe implements PipeTransform { transform(value: any, args?: any): any { let year: number = new Date().getFullYear(); let res:string; if (args) { res = (year- value.getFullYear()+ 1) +'(虛)'; } else { res = year- value.getFullYear() +''; } return res; } }
<p>個人年齡是:{{birthday | age:true}}歲</p>