Angular 8 - 管道



管道被稱為過濾器。它有助於轉換資料並在插值內管理資料,用 {{ | }} 表示。它接受資料、陣列、整數和字串作為輸入,這些輸入用 '|' 符號分隔。本章詳細介紹了管道。

新增引數

在你的 test.component.ts 檔案中建立一個日期方法。

export class TestComponent { 
   presentDate = new Date(); 
}

現在,在你的 test.component.html 檔案中新增以下程式碼。

<div> 
   Today's date :- {{presentDate}} 
</div>

現在,執行應用程式,它將顯示以下輸出 -

Today's date :- Mon Jun 15 2020 10:25:05 GMT+0530 (IST)

這裡,

日期物件被轉換為易於閱讀的格式。

新增日期管道

讓我們在上面的 html 檔案中新增日期管道。

<div> 
   Today's date :- {{presentDate | date }}
</div>

您可以看到以下輸出 -

Today's date :- Jun 15, 2020

日期中的引數

我們可以使用 : 字元在管道中新增引數。我們可以使用此引數顯示短日期、完整日期或格式化日期。在 test.component.html 檔案中新增以下程式碼。

<div> 
   short date :- {{presentDate | date:'shortDate' }} <br/>
   Full date :- {{presentDate | date:'fullDate' }} <br/> 
   Formatted date:- {{presentDate | date:'M/dd/yyyy'}} <br/> 
   Hours and minutes:- {{presentDate | date:'h:mm'}} 
</div>

您可以在螢幕上看到以下響應 -

short date :- 6/15/20 
Full date :- Monday, June 15, 2020 
Formatted date:- 6/15/2020 
Hours and minutes:- 12:00

鏈式管道

我們可以將多個管道組合在一起。當某個場景與多個必須應用於資料轉換的管道相關聯時,這將非常有用。

在上面的示例中,如果要以大寫字母顯示日期,則可以同時應用 DateUppercase 管道。

<div> 
   Date with uppercase :- {{presentDate | date:'fullDate' | uppercase}} <br/>
   Date with lowercase :- {{presentDate | date:'medium' | lowercase}} <br/>  
</div>

您可以在螢幕上看到以下響應 -

Date with uppercase :- MONDAY, JUNE 15, 2020 Date with lowercase :- jun 15, 2020, 12:00:00 am

這裡,

Date、Uppercase 和 Lowercase 是預定義的管道。讓我們在下一節中瞭解其他型別的內建管道。

內建管道

Angular 8 支援以下內建管道。我們將逐一簡要討論。

AsyncPipe

如果資料以可觀察物件的形式出現,則 Async 管道將訂閱可觀察物件並返回傳輸的值。

import { Observable, Observer } from 'rxjs';
export class TestComponent implements OnInit {
   timeChange = new Observable<string>((observer: Observer>string>) => {
      setInterval(() => observer.next(new 
      Date().toString()), 1000); 
   }); 
}

這裡,

Async 管道每秒執行一次訂閱以進行時間變化,並在每次傳遞給它時返回結果。主要優點是,我們不需要在我們的 timeChange 上呼叫 subscribe,並且如果元件被移除,也不需要擔心 unsubscribe。

在你的 test.component.html 中新增以下程式碼。

<div> 
   Seconds changing in Time: {{ timeChange | async }}
</div>

現在,執行應用程式,您可以在螢幕上看到秒數的變化。

CurrencyPipe

它用於將給定的數字轉換為各個國家的貨幣格式。在 test.component.ts 檔案中考慮以下程式碼。

import { Component, OnInit } from '@angular/core'; @Component({ 
   selector: 'app-test', 
   template: ` 
   <div style="text-align:center"> 
      <h3> Currency Pipe</h3> 
      <p>{{ price | currency:'EUR':true}}</p> 
      <p>{{ price | currency:'INR' }}</p> 
   </div> 
   `, 
   styleUrls: ['./test.component.scss'] 
}) 
export class TestComponent implements OnInit { 
   price : number = 20000; ngOnInit() {

   } 
}

您可以在螢幕上看到以下輸出 -

Currency Pipe

€20,000.00 
₹20,000.00

SlicePipe

Slice 管道用於返回陣列的切片。它以索引作為引數。如果您只分配起始索引,則表示它將列印到值的末尾。如果您想列印特定範圍的值,則可以分配起始和結束索引。

我們還可以使用負索引訪問元素。簡單的示例如下所示 -

test.component.ts

import { Component, OnInit } from '@angular/core'; @Component({ 
   selector: 'app-test', 
   template: ` 
   <div> 
      <h3>Start index:- {{Fruits | slice:2}}</h3> 
      <h4>Start and end index:- {{Fruits | slice:1:4}}</h4> 
      <h5>Negative index:- {{Fruits | slice:-2}}</h5> 
      <h6>Negative start and end index:- {{Fruits | slice:-4:-2}}</h6> 
   </div>
   `, 
   styleUrls: ['./test.component.scss'] 
}) 
export class TestComponent implements OnInit { 
   Fruits = ["Apple","Orange","Grapes","Mango","Kiwi","Pomegranate"]; 
   ngOnInit() {

   } 
}

現在執行您的應用程式,您可以在螢幕上看到以下輸出 -

Start index:- Grapes,Mango,Kiwi,Pomegranate
Start and end index:- Orange,Grapes,Mango 
Negative index:- Kiwi,Pomegranate 
Negative start and end index:- Grapes,Mango

這裡,

  • {{Fruits | slice:2}} 表示它從第二個索引值 Grapes 開始到值的末尾。

  • {{Fruits | slice:1:4}} 表示從 1 開始到 end-1,因此結果是從第一個到第三個索引值。

  • {{Fruits | slice:-2}} 表示從 -2 開始到末尾,因為沒有指定結束值。因此,結果是 Kiwi、Pomegranate。

  • {{Fruits | slice:-4:-2}} 表示從負索引 -4 即 Grapes 開始到 end-1,即 -3,因此索引 [-4,-3] 的結果是 Grapes、Mango。

DecimalPipe

它用於格式化十進位制值。它也被認為是 CommonModule。讓我們在 test.component.ts 檔案中瞭解一個簡單的程式碼,

import { Component, OnInit } from '@angular/core'; @Component({ 
   selector: 'app-test', 
   template: ` 
   <div style="text-align:center"> 
      <h3>Decimal Pipe</h3> 
      <p> {{decimalNum1 | number}} </p> 
      <p> {{decimalNum2 | number}} </p> 
   </div> 
   `, 
   styleUrls: ['./test.component.scss'] 
}) 
export class TestComponent implements OnInit { 
   decimalNum1: number = 8.7589623; 
   decimalNum2: number = 5.43; 
   ngOnInit() {

   } 
}

您可以在螢幕上看到以下輸出 -

Decimal Pipe 
8.759 
5.43

格式化值

我們可以在數字模式內應用字串格式。它基於以下格式 -

number:"{minimumIntegerDigits}.{minimumFractionDigits} - {maximumFractionDigits}"

讓我們在我們的程式碼中應用上述格式,

@Component({ 
   template: ` 
   <div style="text-align:center"> 
      <p> Apply formatting:- {{decimalNum1 | number:'3.1'}} </p> 
      <p> Apply formatting:- {{decimalNum1 | number:'2.1-4'}} </p> 
   </div> 
   `, 
})

這裡,

{{decimalNum1 | number:’3.1’}} 表示三位小數,最少一位小數,但對最大小數位數沒有限制。它返回以下輸出 -

Apply formatting:- 008.759

{{decimalNum1 | number:’2.1-4’}} 表示兩位小數,最少一位,最多四位小數,因此它返回以下輸出 -

Apply formatting:- 08.759

PercentPipe

它用於將數字格式化為百分比。格式化字串與 DecimalPipe 概念相同。簡單的示例如下所示 -

import { Component, OnInit } from '@angular/core'; 
@Component({ 
   selector: 'app-test', 
   template: ` 
   <div style="text-align:center"> 
      <h3>Decimal Pipe</h3> 
      <p> {{decimalNum1 | percent:'2.2'}} </p> 
   </div> 
   `, 
   styleUrls: ['./test.component.scss'] 
}) 
export class TestComponent { 
   decimalNum1: number = 0.8178; 
}

您可以在螢幕上看到以下輸出 -

Decimal Pipe 
81.78%

JsonPipe

它用於將 JavaScript 物件轉換為 JSON 字串。在 test.component.ts 檔案中新增以下程式碼,如下所示 -

import { Component, OnInit } from '@angular/core'; 
@Component({ 
   selector: 'app-test', 
   template: ` 
   <div style="text-align:center"> 
      <p ngNonBindable>{{ jsonData }}</p> (1) 
      <p>{{ jsonData }}</p> 
      <p ngNonBindable>{{ jsonData | json }}</p> 
      <p>{{ jsonData | json }}</p> 
   </div> 
   `, 
   styleUrls: ['./test.component.scss'] 
}) 
export class TestComponent { 
   jsonData = { id: 'one', name: { username: 'user1' }} 
}

現在,執行應用程式,您可以在螢幕上看到以下輸出 -

{{ jsonData }} 
(1) 
[object Object] 
{{ jsonData | json }} 
{ "id": "one", "name": { "username": "user1" } }

建立自定義管道

正如我們已經看到的,Angular 8 中有許多預定義的管道可用,但有時我們可能希望以自定義格式轉換值。本節介紹如何建立自定義管道。

使用以下命令建立自定義管道 -

ng g pipe digitcount

執行上述命令後,您可以看到響應 -

CREATE src/app/digitcount.pipe.spec.ts (203 bytes) CREATE src/app/digitcount.pipe.ts (213 bytes) 
UPDATE src/app/app.module.ts (744 bytes)

讓我們使用管道建立一個計算數字中位數的邏輯。開啟 digitcount.pipe.ts 檔案並新增以下程式碼 -

import { Pipe, PipeTransform } from '@angular/core'; @Pipe({ 
   name: 'digitcount' 
}) 
export class DigitcountPipe implements PipeTransform { 
   transform(val : number) : number { 
      return val.toString().length; 
   } 
}

現在,我們添加了計算數字中位數的邏輯。讓我們在 test.component.ts 檔案中新增最終程式碼,如下所示 -

import { Component, OnInit } from '@angular/core'; @Component({ 
   selector: 'app-test', 
   template: ` 
   <div> 
      <p> DigitCount Pipe </p> 
      <h1>{{ digits | digitcount }}</h1> 
   </div> 
   `, 
   styleUrls: ['./test.component.scss'] 
}) 
export class TestComponent implements OnInit { 
   digits : number = 100; 
   ngOnInit() { 
   } 
}

現在,執行應用程式,您可以看到以下響應 -

DigitCount Pipe 
3

工作示例

讓我們在我們的 ExpenseManager 應用程式中使用管道。

開啟命令提示符並轉到專案根資料夾。

cd /go/to/expense-manager

啟動應用程式。

ng serve

開啟 ExpenseEntryListComponent 的模板,src/app/expense-entry-list/expense-entry-list.component.html,並在 entry.spendOn 中包含管道,如下所示 -

<td>{{ entry.spendOn | date: 'short' }}</td>

在這裡,我們使用了日期管道以短格式顯示花費日期。

最後,應用程式的輸出如下所示 -

Pipes
廣告