Angular 8 管道


管道被称为过滤器。它有助于在插值内转换数据和管理数据,用 {{ | }}。它接受数据、数组、整数和字符串作为输入,用“|”符号分隔。本章详细介绍了管道。

添加参数


在你的 测试组件.ts file.

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

现在,在 test.component.html 文件中添加以下代码。

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

现在,运行应用程序,它将显示以下输出:

Today's date :- Mon Jun 15 2020 10订阅一个 observable 并返回传输的值。05 GMT+0530 (IST)

Here,

Date object is converted into easily readable format.

添加日期管道

让我们在上面的 html 文件中添加日期管道。

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

你可以看到下面的输出:

Today's date :- Jun 15, 2020

日期中的参数

我们可以使用 : 字符在管道中添加参数。我们可以使用此参数显示短日期、完整日期或格式化日期。将以下代码添加到 test.component.html file.

<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

链式管道


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

在上面的例子中,如果你想用大写字母显示日期,那么我们可以同时应用 Date and 大写 管在一起。

<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

Here,

Date, Uppercase and Lowercase are pre-defined pipes. Let’s understand other types of built-in pipes in next section.

内置管道


Angular 8 支持以下内置管道。我们将一一进行简要讨论。

异步管道

如果数据以 observables 的形式出现,那么 异步管道 订阅一个 observable 并返回传输的值。

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

Here,

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

在 test.component.html 中添加以下代码。

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

现在,运行应用程序,你可以看到屏幕上的秒数变化。

货币管道

它用于将给定的数字转换为各种国家的货币格式。考虑下面的代码 测试组件.ts file.

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

切片管

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

我们还可以使用负索引来访问元素。简单示例如下图:

测试组件.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管道被称为过滤器。它有助于在插值内转换数据和管理数据,用 {{ | }}。它接受数据、数组、整数和字符串作为输入,用“|”符号分隔。本章详细介绍了管道。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

Here,

  • {{水果 |切片:2}} 表示从第二个索引值 Grapes 开始到值结束。

  • {{水果 |切片:1:4}} 表示从 1 到 end-1,因此结果是一到第三个索引值。

  • {{水果 |切片:-2}} 表示从 -2 到结束,因为没有指定结束值。因此结果是猕猴桃,石榴。

  • {{水果 |切片:-4:-2}} 表示从负索引 -4 开始是 Grapes 到 end-1 是 -3 所以 index[-4,-3] 的结果是 Grapes, Mango。

十进制管道

它用于格式化十进制值。它也被认为是 CommonModule。让我们理解一个简单的代码 测试组件.ts file,

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>
    `,
})

Here,

{{十进制数1 |编号:'3.1'}} 表示小数点后三位和最小一个小数,但对最大小数限制没有限制。它返回以下输出:

Apply formatting:- 008.759

{{十进制数1 |编号:'2.1-4'}} 表示两位小数,允许最小一位和最多四位小数,因此它返回以下输出:

Apply formatting:- 08.759

百分管

它用于将数字格式化为百分比。格式化字符串与 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 字符串。将以下代码添加到 测试组件.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;
    }
}

现在,我们添加了计算数字中位数的逻辑。让我们添加最后的代码 测试组件.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

Open ExpenseEntryListComponent 的 模板, src/app/expense-entry-list/expense-entry-list.component.html 并包括管道 entry.spendOn 如下所述:

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

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

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

Pipes