Angular2的管道Pipe的使用方法


Posted in Javascript onNovember 07, 2017

管道Pipe可以将数据作为输入,然后按照规则将其转换并输出。在Angular2中有许多内置的Pipe,比如DatePipe、UpperCasePipe和CurrencyPipe等。在这里我们主要介绍如何自定义Pipe。

1. 管道定义

Pipe的定义如下代码所示:

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

/*users: Array<any> = [
  { name: '1', id: 1 },
  { name: '2', id: 2 },
  { name: '3', id: 3 },
  { name: '4', id: 4 },
  { name: '5', id: 5 },
  { name: '6', id: 6 }
];*/

@Pipe({ name: 'filterUser' })
export class FilterUserPipe implements PipeTransform {
  transform(allUsers: Array<any>, ...args: any[]): any {
    return allUsers.filter(user => user.id > 3);
  }
}

如代码所示,

  1. 需要使用@Pipe来装饰类
  2. 实现PipeTransform的transform方法,该方法接受一个输入值和一些可选参数
  3. 在@Pipe装饰器中指定管道的名字,这个名字就可以在模板中使用。

注意:当定义完成后,不要忘记在Module的declarations数组中包含这个管道。

2. 管道使用

user.template.html实现如下所示:

<div>
  <ul>
    <li *ngFor="let user of (users | filterUser)">
      {{user.name}}
    </li>
  </ul>
</div>
<button (click)="addUser()"> add new user</button>

user.component.ts实现如下所示:

import { Component } from "@angular/core";

@Component({
  templateUrl: './user.template.html',
})

export class EnvAppComponent {
  id = 7;
  users: Array<any> = [
    { name: '1', id: 1 },
    { name: '2', id: 2 },
    { name: '3', id: 3 },
    { name: '4', id: 4 },
    { name: '5', id: 5 },
    { name: '6', id: 6 }
  ];

  addUser() {
    this.users.push({ name: this.id++, id: this.id++ })
  }
}

在user.component.ts中初始了数据users和定义一个添加user的方法,在user.template.html中使用自定义管道filterUser。

当启动应用时,可以发现只有id大于3的user被显示出来了。可是,当你点击按钮添加用户时,发现并没有什么反应,数据并没有改变。这是为什么呢?

3. 数据变更检测

在Angular2中管道分为两种:纯管道和非纯管道。默认情况下管道都是纯管道。

纯管道就是在Angular检测到它的输入值发生了纯变更时才会执行管道。纯变更也就是说原始数据类型(如String、Number和Boolean等)或者对象的引用发生变化。该管道会忽略对象内部的变化,在示例中,数组的引用没有发生改变,改变的只是数组内部的数据,所以当我们添加数据时并没有立即响应在页面上。

非纯管道会在组件的变更检测周期中执行,而且会对对象的内部数据进行检测。

在我们的示例中将管道变更为非纯管道是非常贱简单的,只要在管道元数据中将添加pure标志为false即可。

代码如下所示:

@Pipe({ name: 'filterUser', pure: false })
export class FilterUserPipe implements PipeTransform {
  transform(allUsers: Array<any>, ...args: any[]): any {
    return allUsers.filter(user => user.id > 3);
  }
}

这样每当我们添加新用户时,数据就会马上响应在页面上了。

在根模块声明的pipe在页面中引用有效,而在页面中引用的component中的模板则无效,这也是令我困惑的地方...

寻求了一些解决方案,大多是要注意得在根模块中声明,于是我做了个尝试,将组件也写成一个功能模块,并在组件功能模块中申明pipe,结果很欣喜,组件中的pipe生效了。

具体操作方法:

只需新建组件功能模块,并在改模块中申明pipe,myComponent.module.ts

import { NgModule } from '@angular/core';
import { IonicPageModule } from 'ionic-angular';
import { myComponent } from 'myComponent.ts';
import { HelloPipe } from "hello.pipe.ts";

@NgModule({
 declarations: [
  myComponent,
  HelloPipe
 ],

 imports: [
  IonicPageModule.forChild(myComponent)
 ],

 exports: [
  myComponent
 ]
})

export class MyComponent {}

大功告成,组件的模板引用pipe得以生效.

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript 有用的脚本函数
May 07 Javascript
javascript中的对象创建 实例附注释
Feb 08 Javascript
Javascript操作URL函数修改版
Nov 07 Javascript
javascript中普通函数的使用介绍
Dec 19 Javascript
node.js中的fs.fstat方法使用说明
Dec 15 Javascript
JQuery导航菜单选择特效
Apr 11 Javascript
Swiper 4.x 使用方法(移动端网站的内容触摸滑动)
May 17 Javascript
微信网页授权并获取用户信息的方法
Jul 30 Javascript
Angular7中创建组件/自定义指令/管道的方法实例详解
Apr 02 Javascript
js实现掷骰子小游戏
Oct 24 Javascript
Vue+ElementUI table实现表格分页
Dec 14 Javascript
JS代码实现页面切换效果
Jan 10 Javascript
浅谈react 同构之样式直出
Nov 07 #Javascript
vue组件watch属性实例讲解
Nov 07 #Javascript
vue2+el-menu实现路由跳转及当前项的设置方法实例
Nov 07 #Javascript
React Native使用百度Echarts显示图表的示例代码
Nov 07 #Javascript
浅谈在Vue-cli里基于axios封装复用请求
Nov 06 #Javascript
浅谈mint-ui 填坑之路
Nov 06 #Javascript
基于vue实现分页效果
Nov 06 #Javascript
You might like
php mysql Errcode: 28 终极解决方法
2009/07/01 PHP
20个2014年最优秀的PHP框架回顾
2014/10/22 PHP
thinkphp常见路径用法分析
2014/12/02 PHP
mouse_on_title.js
2006/08/25 Javascript
js window.event对象详尽解析
2009/02/17 Javascript
Eclipse去除js(JavaScript)验证错误
2014/02/11 Javascript
删除条目时弹出的确认对话框
2014/06/05 Javascript
jQuery setTimeout传递字符串参数报错的解决方法
2014/06/09 Javascript
JavaScript中的toLocaleLowerCase()方法使用详解
2015/06/06 Javascript
jquery实现带缩略图的可定制高度画廊效果(5种)
2015/08/28 Javascript
javascript html5实现表单验证
2016/03/01 Javascript
检查表单元素的值是否为空的实例代码
2016/06/16 Javascript
jQuery使用Layer弹出层插件闪退问题
2016/12/22 Javascript
jQuery+CSS3实现点赞功能
2017/03/13 Javascript
Web制作验证码功能实例代码
2017/06/19 Javascript
JS使用正则表达式获取小括号、中括号及花括号内容的方法示例
2018/06/01 Javascript
node中的session的具体使用
2018/09/14 Javascript
JS实现头条新闻的经典轮播图效果示例
2019/01/30 Javascript
JavaScript中展开运算符及应用的实例代码
2021/01/14 Javascript
[05:31]干嘛呢兄弟!DOTA2 TI9语音轮盘部分出处
2019/05/14 DOTA
Python的设计模式编程入门指南
2015/04/02 Python
安装Python的web.py框架并从hello world开始编程
2015/04/25 Python
Python内置模块turtle绘图详解
2017/12/09 Python
Python实现基于POS算法的区块链
2018/08/07 Python
基于python判断字符串括号是否闭合{}[]()
2020/09/21 Python
利用CSS3实现平移动画效果示例代码
2016/10/12 HTML / CSS
Blue Nile蓝色尼罗河香港官网:世界最大在线钻石珠宝销售商
2020/05/07 全球购物
介绍下Java中==和equals的区别
2013/09/01 面试题
保护环境倡议书
2014/04/14 职场文书
2014年建筑工作总结
2014/11/26 职场文书
2014全年工作总结
2014/11/27 职场文书
小学端午节活动总结
2015/02/11 职场文书
2016年基层党支部书记公开承诺书
2016/03/25 职场文书
有关保护环境的宣传标语100条
2019/08/07 职场文书
JavaScript执行机制详细介绍
2021/12/06 Javascript
MySQL实现用逗号进行拼接、以逗号进行分割
2022/12/24 MySQL