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 相关文章推荐
用jQuery打造TabPanel效果代码
May 22 Javascript
js原生态函数中使用jQuery中的 $(this)无效的解决方法
May 25 Javascript
javascript 进阶篇2 CSS XML学习
Mar 14 Javascript
在浏览器窗口上添加遮罩层的方法
Nov 12 Javascript
图片轮换效果实现代码(点击按钮停止执行)
Apr 12 Javascript
jQuery内部原理和实现方式浅析
Feb 03 Javascript
基于jQuery对象和DOM对象和字符串之间的转化实例
Aug 08 jQuery
vue组件Prop传递数据的实现示例
Aug 17 Javascript
React中jquery引用的实现方法
Sep 12 jQuery
详解基于Vue的支持数据双向绑定的select组件
Sep 02 Javascript
VSCode 添加自定义注释的方法(附带红色警戒经典注释风格)
Aug 27 Javascript
vue data有值,但是页面{{}} 取不到值的解决
Nov 09 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如何透过ODBC来存取数据库
2006/10/09 PHP
php mysql like 实现多关键词搜索的方法
2016/10/29 PHP
php实现对文件压缩简单的方法
2019/09/29 PHP
PHP实现倒计时功能
2020/11/16 PHP
几个比较经典常用的jQuery小技巧
2010/03/01 Javascript
使用Post提交时须将空格转换成加号的解释
2013/01/14 Javascript
jQuery 写的简单打字游戏可以提示正确和错误的次数
2014/07/01 Javascript
jQuery中extend函数的实现原理详解
2015/02/03 Javascript
js实现汉字排序的方法
2015/07/23 Javascript
JavaScript类继承及实例化的方法
2015/07/25 Javascript
easyui Draggable组件实现拖动效果
2015/08/19 Javascript
js中javascript:void(0) 真正含义
2020/11/05 Javascript
详解javascript new的运行机制
2016/01/26 Javascript
Angularjs 实现分页功能及示例代码
2016/09/14 Javascript
JS封装的选项卡TAB切换效果示例
2016/09/20 Javascript
jQuery实现的模拟弹出窗口功能示例
2016/11/24 Javascript
微信小程序 刷新上拉下拉不会断详细介绍
2017/05/11 Javascript
Node.js v8.0.0正式发布!看看带来了哪些主要新特性
2017/06/02 Javascript
react系列从零开始_简单谈谈react
2017/07/06 Javascript
jQuery实现的点击按钮改变样式功能示例
2018/07/21 jQuery
微信小程序生成海报分享朋友圈的实现方法
2019/05/06 Javascript
Vue使用vue-recoure + http-proxy-middleware + vuex配合promise实现基本的跨域请求封装
2019/10/21 Javascript
详解微信小程序工程化探索之webpack实战
2020/04/20 Javascript
Python写的Socks5协议代理服务器
2014/08/06 Python
PyQT实现多窗口切换
2018/04/20 Python
Python中实现变量赋值传递时的引用和拷贝方法
2018/04/29 Python
在python2.7中用numpy.reshape 对图像进行切割的方法
2018/12/05 Python
jupyter lab文件导出/下载方式
2020/04/22 Python
英国知名的护肤彩妆与时尚配饰大型综合零售电商:Unineed
2016/11/21 全球购物
Java里面有没有全局变量?为什么?
2015/02/06 面试题
MySQL面试题
2014/01/12 面试题
武汉世纪畅想数字传播有限公司.NET笔试题
2014/07/22 面试题
中文专业学生自我评价范文
2014/02/06 职场文书
葬礼司仪主持词
2014/03/31 职场文书
销售人才自我评价范文
2014/09/27 职场文书
家庭经济困难证明
2015/06/23 职场文书