|
)符號。
在模板中使用管道
在HTML中的模板綁定符號{{}}
內調用管道:
{{ name | uppercase }}
帶參數(shù)的管道
當以HTML的形式使用管道時,如果需要傳遞參數(shù)給管道,只需在管道名字后面加冒號(:
)即可。如果有多個參數(shù),可以在每個參數(shù)后面都加入冒號(比如slice:1:5)。
{{ today | date:"MM/dd/yy" }}
鏈式管道
多個管道間用|
符號隔開:
{{ today | date | uppercase}}
不過,Angular4中移除了部分Angular1中內置的過濾器。
Angular內置管道整理如下:
DatePipe
用來格式化日期數(shù)據(jù),使用方法如下:
{{ expression | date: format }}
expression
可以是 :
// demo-pipe.component.html
{{ today | date }} // Jun 10, 2017
{{ today | date: 'y-MM-dd'}} // 2017-06-10
// demo-pipe.component.ts
this.today = new Date();
JsonPipe
JsonPipe
管道通過JSON.stringify()
來將輸入數(shù)據(jù)對象轉換成對象字符串,該管道主要用于開發(fā)調試:
// demo-pipe.component.html
<pre>{{jsonObject | json}}</pre>
// demo-pipe.component.ts
jsonObject: Object = {firstname: 'bar', lastname: 'qux', address: {street: 'aaa', tel: [1, 2]}};
輸出結果為:
//json
{
"firstname": "bar",
"lastname": "qux",
"address": {
"street": "aaa",
"tel": [1, 2]
}
}
UpperCasePipe
UpperCasePipe
管道用于將文本中所有小寫字母轉換成大寫字母。
語法格式:
expression | uppercase
LowerCasePipe
LowerCasePipe
管道用于將文本中所有大寫字母轉換成小寫字母。
語法格式:
expression | lowercase
DecimalPipe
DecimalPipe
管道用于對數(shù)值的整數(shù)與小數(shù)部分按照指定規(guī)則進行格式化,這種格式化方式也成為本地格式化處理,語法如下:
expression | number[:digitInfo]
參數(shù)digitInfo
的格式如下:
{minIntegerDigits}.{minFractionDigits}-{maxfractionDigits}
minIntegerDigits
:整數(shù)部分保留最小的位數(shù),默認值為1.minFractionDigits
:小數(shù)部分保留最小的位數(shù),默認值為0.maxFractionDigits
:小數(shù)部分保留最大的位數(shù),默認值為3.// demo-pipe.component.html
<p>A 變量:{{a | number: '3.4-5'}}</p>
<p>B 變量:{{b | number: '3.1-5'}}</p>
// demo-pipe.component.ts
a: number = 2.718281828459045;
b: number = 33456;
轉換后結果:
a 變量:002.71828
b 變量:33,456.0
格式化變量a所采用的參數(shù)為3.4-5,參數(shù).左邊的3表示整數(shù)位最少保留三位,原值整數(shù)位為1位不足3位,所以用0補齊。參數(shù).右邊的4-5表示保留小數(shù)的最小數(shù)位為4為,最大數(shù)位為5位,因原始數(shù)據(jù)小數(shù)位大于5位,所以保留四舍五入后的5位小數(shù)。
格式化變量b所采用的參數(shù)為3.1-5,參數(shù).左邊的3表示整數(shù)位最少保留三維,原值正式位為5位,大于3位,所以全部保留。參數(shù).右邊的1-5表示保留小數(shù)的最小數(shù)位為1位,最大數(shù)位為5位,因原始數(shù)據(jù)沒有小數(shù)位,因此采用最小1位限制的規(guī)則,小數(shù)位補0。
CurrencyPipe
CurrentPipe
管道可以將數(shù)值進行貨幣格式化處理。語法如下:
expression | currency[: currencyCode[: symbolDisplay[: digitInfo]]]
currentcyCode
:表示要格式化的目標貨幣格式,值為ISO 4217貨幣碼,如CNY人民幣、USD美元、EUR歐元等。 symbolDisplay
:表示以該類型貨幣的哪種格式顯示,值為布爾值,true表示顯示貨幣符號如¥、$等,false表示顯示ISO 4217貨幣碼如CNY、USD等。digitInfo
:參考DecimalPipe管道。// demo-pipe.component.html
<p>A 變量:{{ a | currency: 'USD': false }}</p>
<p>B 變量:{{ b | currency: 'CNY': true: '3.1-3'}}</p>
// demo-pipe.component.ts
a: number = 0.259;
b: number = 20.6745;
轉換后結果
A 變量:USD0.259
B 變量:¥020.675
PercentPipe
PercentPipe
管道可以對數(shù)值進行百分比處理。語法如下:
expression | percent[: digitInfo]
digitInfo
:參考DecimalPipe管道
// demo-pipe.component.html
<p>A 變量:{{ a | percent }}</p>
<p>B 變量:{{ b | percent: '3.1-3' }}</p>
// demo-pipe.component.ts
a: number = 0.279;
b: number = 0.657;
輸出:
A 變量:27.9%
B 變量:065.7%
注意:這里的百分化處理是在原值的基礎上進行乘以100%,而不是簡單的字符串拼接。
SlicePipe
SlicePip
e管道用于裁剪數(shù)組或字符串,返回裁剪后的目標子集。
語法如下:
expression | slice: start[: end]
SlicePipe
是基于Array.prototype.slice()
方法和String.prototype.slice()
方法來實現(xiàn)的。
實例:
// demo-pipe.component.html
<p>{{ 'abcdef' | slice: 2 : 4}}</p>
<p>
<span *ngFor="let a of ([1, 'b', 3, 'c', 4] | slice: 2)">
{{a}}
</span>
</p>
自定義管道
自定義管道的步驟:
@Pipe
裝飾器定義 Pipe
的 metadata 信息,如 Pipe 的名稱 - 即 name 屬性 PipeTransform
接口中定義的 transform
方法sortPipe
:
// app/pipes/sort.pipe.ts
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
name: 'sort'
})
export class SortPipe implements PipeTransform {
transform(array: Array<any>, args?: string): Array<any> {
array.sort((a: any, b: any) => {
if (a < b) {
return -1;
} else if (a > b) {
return 1;
} else {
return 0;
}
});
return array;
}
}
在上面的代碼中,我們使用@Pipe()
裝飾器定義了一個名為“”的管道,類的transform
方法是管道的關鍵,它可以接受任意的參數(shù),第一個為過濾值,后面的參數(shù)都是可選的過濾參數(shù)。
注:這里只是為了明顯排序,其實可以直接使用array.sort()
。
使用:
// demo-pipe.component.ts
arr: number[] = [80, 2, 5, 30];
// demo-pipe.component.html
<li *ngFor="let a of (arr | sort)">{{a}}</li>
注:我們更傾向使用純管道。對于自定義管道,默認是純管道,如果需要轉為非純管道,可以將`@Pipe()`中的元數(shù)據(jù)的pure屬性設置為false。
附錄(來源官網(wǎng)):
純管道
Angular只有在它檢測到輸入值發(fā)生了純變更時才會執(zhí)行純管道。 純變更是指對原始類型值(String、Number、Boolean、Symbol)的更改, 或者對對象引用(Date、Array、Function、Object)的更改。
Angular會忽略(復合)對象內部的更改。 如果我們更改了輸入日期(Date)中的月份、往一個輸入數(shù)組(Array)中添加新值或者更新了一個輸入對象(Object)的屬性,Angular都不會調用純管道。
非純管道
Angular會在每個組件的變更檢測周期中執(zhí)行非純管道。 非純管道可能會被調用很多次,和每個按鍵或每次鼠標移動一樣頻繁。
更多建議: