原文地址

https://www.jianshu.com/p/5140a91959ca

对自定义管道的认识

管道的定义中体现了几个关键点:
  1、管道是一个带有“管道元数据(pipe metadata)”装饰器的类。
  2、这个管道类实现了PipeTransform接口的transform方法,该方法接受一个输入值和一些可选参数,并返回转换后的值。
  3、当每个输入值被传给transform方法时,还会带上另一个参数,比如我们这个管道中的exponent(放大指数)。
  4、我们通过@Pipe装饰器告诉Angular:这是一个管道。该装饰器是从Angular的core库中引入的。
  5、这个@Pipe装饰器允许我们定义管道的名字,这个名字会被用在模板表达式中。它必须是一个有效的JavaScript标识符。 比如,我们下面这个管道的名字是exponentialStrength。

PipeTransform接口

  transform方法是管道的基本要素。 PipeTransform接口中定义了它,并用它指导各种工具和编译器。 理论上说,它是可选的。Angular不会管它,而是直接查找并执行transform方法。

自定义管道需要注意

  我们使用自定义管道的方式和内置管道完全相同。
  我们必须在AppModule的declarations数组中包含这个管道。
  我们必须手动注册自定义管道。如果忘了,Angular就会报告一个错误。
  还需要注意的是,我们使用的时候的管道的名字是自定义管道用@Pipe注解的时候命名的名字。

自定义管道实例

  以下是我根据自定义管道的知识写的几个实例,有的是参考网上的实例在本地实现可行的代码,也在此提供参考

过滤todo

/*
管道中纯管道和非纯管道之间的区别关键在于:
如果是纯管道,他检测的深读很低,比如检测一个对象数组,对象数组中的对象的某个属性发生变化的时候,纯管道是检测不到的,这时候就需要用到非纯管道
*/
import {Pipe, PipeTransform} from '@angular/core';
/*
* Example:
* todoList | todosStatusPipe:'done':selectFilter
* 其实这里我们已知一定是根据todo的done属性来过滤,那么实际上是可以将'done'这个传值给去了,直接在管道方法中用done来判断,但是
* 这里主要是为了说明.引出的属性和[]引出的属性是有区别的,[]是可以传入变量来引出属性的
*/
@Pipe({
name: 'todosStatusPipe',
pure: false
})
export class TodosStatusPipe implements PipeTransform {
transform(value: Array<any>, filterString: string, status: string): Array<any> {
let filterTodoList = [];
switch(status){
case 'all':
filterTodoList = value;
break;
case 'active':
filterTodoList = value.filter(todo => !todo[filterString]);
break;
case 'completed':
filterTodoList = value.filter(todo => todo[filterString]);
break;
}
return filterTodoList;
}
}

指数倍增管道

/*
exponential-strength.pipe.ts
步骤 :
1、导入Pipe,PipeTransform
2、通过注解定义名字,定义是纯管道还是非纯管道,默认是纯管道
3、定义管道并继承PipeTransform
4、实现继承的方法transform
*/
import { Pipe, PipeTransform } from '@angular/core';
/*
* Raise the value exponentially
* Takes an exponent argument that defaults to 1.
* Usage:
* value | exponentialStrength:exponent
* Example:
* {{ 2 | exponentialStrength:10 }}
* formats to: 1024
*/
@Pipe({name: 'exponentialStrength'})
export class ExponentialStrengthPipe implements PipeTransform {
transform(value: number, exponent: string): number {
let exp = parseFloat(exponent);
return Math.pow(value, isNaN(exp) ? 1 : exp);
}
}

判断性别管道

import {Pipe, PipeTransform} from '@angular/core';
@Pipe({
name: 'sexReform',
//非纯管道
//重点在于实现PipeTransform接口的transform方法,定义为非纯管道仅用于演示,非纯管道对性能影响较大,尽量避免。
pure:false
})
export class SexReformPipe implements PipeTransform {
transform(value: any, args?: any): any {
let chineseSex;
switch (value) {
case 'male':
chineseSex = '男';
break;
case 'female':
chineseSex = '女';
break;
default:
chineseSex = '未知性别';
break;
}
return chineseSex;
}
}

代码资料

angular实例代码中(https://github.com/crk123kk/angular-example)的angular-pipe-custom

angular自定义管道的更多相关文章

  1. Angular 自定义管道

    管道的作用就是将原始值进行转化处理,转换为所需要的值: 1. 新建sex-reform.pipe.ts文件 ng g pipe sex-reform 2. 编辑sex-reform.pipe.ts文件 ...

  2. Angular:管道和自定义管道

    ①管道的使用,更多管道在angular官网上有 <p>全部转为大写:{{'hahahah' | uppercase}}</p> <p>保留两位小数:{{1.4555 ...

  3. [转]Angular2 使用管道Pipe以及自定义管道格式数据

    本文转自:https://www.pocketdigi.com/20170209/1563.html 管道(Pipe)可以根据开发者的意愿将数据格式化,还可以多个管道串联. 纯管道(Pure Pipe ...

  4. angular8自定义管道、指令以及获取dom值

    版本: 1.自定义管道: example: 定义一个*ngFor 可以获取key值的管道 keyObject.pipe.ts // key value 管道 import { Pipe, PipeTr ...

  5. Angular自定义指令(directive)

    angular自定义指令,意我们可以通过angula自己定义指令,来实现我们的特殊要求,为所欲为,一支穿云箭,千军万马来相见 多少年的老规矩了,先看代码: <!DOCTYPE html> ...

  6. 关于angular 自定义directive

    关于angular 自定义directive的小结 首先我们创建一个名为"expander"的自定义directive指令: angular.module("myApp& ...

  7. angular 自定义指令详解 Directive

    在angular中,Directive,自定义指令的学习,可以更好的理解angular指令的原理,当angular的指令不能满足你的需求的时候,嘿嘿,你就可以来看看这篇文章,自定义自己的指令,可以满足 ...

  8. Angular 4 管道

    一.date管道 1.html 2. 控制器中的定义brithday 3.效果图 如果时间格式 为: 我的生日是{{birthday | date:'yyyy-MM-dd HH:mm:ss'}} 则效 ...

  9. Ocelot自定义管道中间件

    Ocelot是啥就不介绍了哈,网关大家都知道,如果大家看过源码会发现其核心就是由一个个的管道中间件组成的,当然这也是Net Core的亮点之一.一个请求到来,会按照中间件的注册顺序进行处理,今天的问题 ...

随机推荐

  1. AES与RAS结合加解密方案

    import java.io.IOException; import java.security.InvalidKeyException; import java.security.KeyFactor ...

  2. C# 读取指定文件夹中的全部文件,并按规则生成SQL语句!

    本实例的目的在于: 1 了解怎样遍历指定文件夹中的全部文件 2 控制台怎样输入和输出数据 代码: using System; using System.IO; namespace ToSql{ cla ...

  3. Linux(centos)下mysql编译安装教程

    Linux下mysql编译安装教程 #查看linux发行版本 cat /etc/issue #查看linux内核版本号 uname -r 本文測试环境centOS6.6 一.Linux下编译安装MyS ...

  4. 11lession-class 类

    python既然也是面向对象编程的语言,自然也就跟java相似,它也有类的概念.今天就简单学习下.看如下代码 #!/usr/bin/python class cl_test: test = 0 def ...

  5. 31.Node.js 常用工具 util

    转自:http://www.runoob.com/nodejs/nodejs-module-system.html util 是一个Node.js 核心模块,提供常用函数的集合,用于弥补核心JavaS ...

  6. 11.Bean2Document-BEAN转document

    1. package com.glodon.gspm.adapter.plugin.common; import com.glodon.cloudt.tenancy.context.TenantCon ...

  7. 洛谷P2147 [SDOI2008]Cave 洞穴勘测

    题目描述 辉辉热衷于洞穴勘测. 某天,他按照地图来到了一片被标记为JSZX的洞穴群地区.经过初步勘测,辉辉发现这片区域由n个洞穴(分别编号为1到n)以及若干通道组成,并且每条通道连接了恰好两个洞穴.假 ...

  8. pycharm 注册 License server方式

    在输入框输入以下内容即可:http://idea.yangyusb.com

  9. HDU5126 stars(CDQ分治)

    传送门 大意: 向三维空间中加点,询问一个三维区间中点的个数. 解题思路: 带修改CDQ,将修改和询问一起插入CDQ分治询问. (询问可以由8个前缀和加减操作实现) 其中第一层CDQ维护x有序. 第二 ...

  10. Django项目之Web端电商网站的实战开发(一)

    说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 目录 一丶项目介绍 二丶电商项目开发流程 三丶项目需求 四丶项目架构概览 五丶项目数据库设计 六丶项目框架搭建 一丶项目介绍 产品 ...