Pipe管道
用于转换显示文本叫Pipe管道,其作用是对数据进一步转换。
为什么需要?
交易状态数量一般会多达五六项,而且数据一般是用字符串或数字在数据库中表示,倘若直接显示这些数据,除了开发人员谁也不知道这是些代表什么。
1
新订单2
待支付4
待发货8
完成
如何创建Pipe?
Pipe 是一个简单类,我们只需要实现 PipeTransform
以及利用装饰器 @Pipe
定义Pipe名称就行了。
@Pipe({ name: 'tradeStatus' })
export class StatusPipe implements PipeTransform {
transform(value: any, cancelReason?: string) {
switch (value) {
case 1: return `新订单`;
case 2: return `待支付`;
case 4: return `待发货`;
case 8: return `完成`;
case 16: return `取消(原因:${cancelReason})`;
default: return `无效`;
}
}
}
接口 transform
方法至少需要一个参数 value
表示待转换的值,而后面的可选参数允许我们额外提供,用于特定处理,比如这里的取消原因。
如何使用?
绝大多数情况下,会在插值表达式中使用,只需要Pipe操作符 |
就非常方便调用。
{{item.status | tradeStatus }}
如果是已经取消的,还可以加上取消原因:
{{item.status | tradeStatus: item.cancelReason }}
如何在Component或Service中使用Pipe
前面我说它是一个简单类,而对于类的使用就是实例它。
console.log(new StatusPipe().transform(1)); // 新订单
内置Pipe
Angular提供了几个常用的Pipe:
async
自动订阅异步,见*ngFor。
DatePipe
日期格式化提供了非常丰富的格式化符号,{{ now | date: 'yyyy-MM-dd' }}
=> 2017-06-24
。
CurrencyPipe
货币格式化,{{ 100 | currency:'CNY' }}
=> CNY100.00
。
它货币代码遵循的是ISO 4217标准。然而,其实我只想要一个保留2位小数+千位符而已啦,然后这个货币内置很难满足我的要求:
{{ 1000.555 | currency:'CNY':true:'3.2-2' }}
Result: CN¥1,000.56
DecimalPipe
数字格式化,{{ 10000.566 | number: '3.2-2' }}
=> 10,000.57
。
其实用它来表示货币,感觉更符合本土化,而对于货币也短了一点点。
slice
从数组中返回选定的项,比如获取下标1至5的数据 {{ users | slice:1:5 }}
。
json
JSON字符串化,调试的时候好方便。{{ user | json }}
。
UpperCasePipe
大写字母化,{{ 'asdf' | uppercase }}
=> ASDF
。
LowerCasePipe
大写字母化,{{ 'Asdf' | lowercase }}
=> asdf
。