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

Chained(链式)管道

我们可以将多个管道组合在一起。 当一个场景与多个必须应用于数据转换的管道关联时,这将非常有用。

在上面的例子中,如果你想用大写字母显示日期,那么我们可以同时应用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 支持以下内置管道。 我们将一一简要讨论。

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); 
   }); 
}

这里,

异步管道对每一秒的时间变化进行订阅,并在传递给它时返回结果。 主要优点是,我们不需要在 timeChange 上调用 subscribe,并且如果组件被删除,也不用担心取消订阅。

在 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(切片管道)

切片管道用于返回数组的切片。 它以索引作为参数。 如果您仅分配起始索引,则意味着它将打印到值的末尾。 如果你想打印特定范围的值,那么我们可以指定开始和结束索引。

我们还可以使用负索引来访问元素。 简单的例子如下所示 −

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 开始到结束,因为没有指定结束值。 因此结果是猕猴桃、石榴。

  • {{Fruits | slice:-4:-2}} 表示从负索引 -4 开始是葡萄,到 end-1 是 -3,所以索引[-4,-3] 的结果是葡萄、芒果。

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)

让我们创建一个使用 Pipe 来计算数字中数字的逻辑。 打开 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>

在这里,我们使用日期管道以短格式显示日期的支出。

最后,应用程序的输出如下所示 −

管道