Angular框架专题

Angular框架中的Pipe管道符(配合8.X源码)

2021-11-22  本文已影响0人  听书先生

Angular中的Pipe管道主要的目的是用来对输入的数据进行处理的(比如:大小写的转换、数值的计算、以及日期的格式化)

1、内置管道
管道名 用途
DatePipe 日期管道,格式化日期
JsonPipe 将输入数据对象经过JSON.stringify()方法转换后输出对象的字符串
UpperCasePipe 将文本所有小写字母转换成大写字母
LowerCasePipe 将文本所有大写字母转换成小写字母
DecimalPipe 将数值按特定的格式显示文本
CurrentcyPipe 将数值转百分比格式
SlicePipe 将数组或者字符串裁剪成新子集
<div>
   <p>{{ 'abcd' | uppercase }}</p> 
</div>

// ABCD
<div>
   <p>{{ 'ABCD' | lowercase }}</p> 
</div>

// abcd

{minIntegerDigits}.{minFractionDigits}-{maxfractionDigits}

<p>{{ 3.14159265 | number: '1.4-4' }}</p>  

// 3.1416
<p>{{ '2021/11/22' | date: 'EEE' }}</p>

// Mon
obj = {
    name:'zhangsan',
    age:20,
    foo(){
      console.log('123');
    }
  }

<p>{{ obj | json }}</p>

// { "name": "zhangsan", "age": 20 }

表达式:expression | currency[: currencyCode[: symbolDisplay[: digitInfo]]]

<p>{{ 200.12 | currency:'CNY':true:'3.0-0' }}</p>

// CN¥200

表达式:expression | percent[: digitInfo]

<p>{{ 0.245 | percent:'2.1-2' }}</p>

// 24.5%

表达式:expression | slice: start[: end]

<p>{{ 0.245 | percent:'2.1-2' }}</p>

// 24.5%
2、管道链

管道链可以将多个管道连接在一起,组成管道链对数据进行处理。

str = 'abcde';

<p>{{ str | slice:0:3 | uppercase  }}</p>

// ABC
3、自定义管道

开发者也可以自己去定义管道符,主要的步骤为以下几个步骤:

getKey.pipe.ts:

import { Pipe, PipeTransform } from '@angular/core';

// 获取对象的键值
@Pipe({ name: 'getKey' })
export class GetKeyPipe implements PipeTransform {
  transform(value: any, args?:any): any {
    return Object.keys(value).map((key) => Object.assign({ key }, value[key]));
  }
} 

4、管道分类:

Pipe管道相关ts接口定义:

export interface Pipe {
  name: string;
  pure ?: boolean;
}

PipeDecorator接口定义:

export const Pipe: PipeDecorator = <PipeDecorator>makeDecorator('Pipe', {
  name: undefined,
  pure: true, // 默认是pure
});

PipeTransform接口定义:

export interface PipeTransform {
  transform(value: any, ...args: any[]): any;
}
5、PipeResolver部分
// @angular/compiler/src/pipe_resolver.ts
@CompilerInjectable()
export class PipeResolver {
  constructor(private _reflector: ɵReflectorReader = ɵreflector) {}

  // 通过内部的ɵReflectorReader对象提供的API读取metadata信息
  resolve(type: Type<any>, throwIfNotFound = true): Pipe {
    const metas = this._reflector.annotations(resolveForwardRef(type));
    if (metas) {
      // 读取保存的Pipe metadata 信息
      const annotation = ListWrapper.findLast(metas, _isPipeMetadata);
      if (annotation) { return annotation; }
    }
    if (throwIfNotFound) {
      throw new Error(`No Pipe decorator found on ${stringify(type)}`);
    }
    return null;
  }
}

上一篇下一篇

猜你喜欢

热点阅读