Angular4 開發(fā)實戰(zhàn):(8) 創(chuàng)建管道(Pipe)

2018-06-19 11:25 更新
管道可以在模板中轉(zhuǎn)換顯示的內(nèi)容。

Angular4中的管道其實也就是Angula1中的過濾器,用法一樣,都是使用(|)符號。 在模板中使用管道 在HTML中的模板綁定符號{{}}內(nèi)調(diào)用管道:

{{ name | uppercase }}

帶參數(shù)的管道 當以HTML的形式使用管道時,如果需要傳遞參數(shù)給管道,只需在管道名字后面加冒號(:)即可。如果有多個參數(shù),可以在每個參數(shù)后面都加入冒號(比如slice:1:5)。

{{ today | date:"MM/dd/yy" }}

鏈式管道 多個管道間用|符號隔開:

{{ today | date | uppercase}}

不過,Angular4中移除了部分Angular1中內(nèi)置的過濾器。 Angular內(nèi)置管道整理如下: 注:對純管道和非純管道的解釋,可參考文章最后的附錄。 下面會分別講解每一個管道的用法。 DatePipe DatePipe用來格式化日期數(shù)據(jù),使用方法如下:

{{ expression | date: format }}

expression可以是 :
  • Date日期對象
  • 日期字符串,如”2016/04/05”
  • 毫秒級時間戳
  • format自定義日期格式如下表(取2016-06-08 20:05:08時間為例)
看例子:

// 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ù)對象轉(zhuǎn)換成對象字符串,該管道主要用于開發(fā)調(diào)試:

// demo-pipe.component.html    

<pre>{{jsonObject | json}}</pre>    


// demo-pipe.component.ts   

jsonObject: Object = {firstname: 'bar', lastname: 'qux', address: {street: 'aaa', tel: [1, 2]}};   


輸出結(jié)果為:   

//json  

{   

  "firstname": "bar",   

  "lastname": "qux",   

  "address": {   

    "street": "aaa",   

    "tel": [1, 2]

  }  

}

UpperCasePipe UpperCasePipe管道用于將文本中所有小寫字母轉(zhuǎn)換成大寫字母。 語法格式:

expression | uppercase

LowerCasePipe LowerCasePipe管道用于將文本中所有大寫字母轉(zhuǎn)換成小寫字母。 語法格式:

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;       


轉(zhuǎn)換后結(jié)果:   

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;       


轉(zhuǎn)換后結(jié)果   

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%

注意:這里的百分化處理是在原值的基礎(chǔ)上進行乘以100%,而不是簡單的字符串拼接。 SlicePipe SlicePipe管道用于裁剪數(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 屬性
  • 實現(xiàn) PipeTransform 接口中定義的 transform 方法
我們來創(chuàng)建一個排序的管道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方法是管道的關(guān)鍵,它可以接受任意的參數(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>

注:我們更傾向使用純管道。對于自定義管道,默認是純管道,如果需要轉(zhuǎn)為非純管道,可以將`@Pipe()`中的元數(shù)據(jù)的pure屬性設置為false。 附錄(來源官網(wǎng)): 純管道 Angular只有在它檢測到輸入值發(fā)生了純變更時才會執(zhí)行純管道。 純變更是指對原始類型值(String、Number、Boolean、Symbol)的更改, 或者對對象引用(Date、Array、Function、Object)的更改。 Angular會忽略(復合)對象內(nèi)部的更改。 如果我們更改了輸入日期(Date)中的月份、往一個輸入數(shù)組(Array)中添加新值或者更新了一個輸入對象(Object)的屬性,Angular都不會調(diào)用純管道。 非純管道 Angular會在每個組件的變更檢測周期中執(zhí)行非純管道。 非純管道可能會被調(diào)用很多次,和每個按鍵或每次鼠標移動一樣頻繁。

如發(fā)現(xiàn)任何問題或有好的建議,歡迎在下方評論留言。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號