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  Error 对象 错误处理
May 18 Javascript
JavaScript constructor和instanceof,JSOO中的一对欢喜冤家
May 25 Javascript
jQuery中json对象的复制方式介绍(数组及对象)
Jun 08 Javascript
js精准的倒计时函数分享
Jun 29 Javascript
jQuery模拟Marquee实现无缝滚动效果完整实例
Sep 29 Javascript
基于Bootstrap仿淘宝分页控件实现代码
Nov 07 Javascript
微信小程序 Toast自定义实例详解
Jan 20 Javascript
node打造微信个人号机器人的方法示例
Apr 26 Javascript
Vue.js中使用iView日期选择器并设置开始时间结束时间校验功能
Aug 12 Javascript
详解Vue项目在其他电脑npm run dev运行报错的解决方法
Oct 29 Javascript
vue实现PC端分辨率适配操作
Aug 03 Javascript
利用React高阶组件实现一个面包屑导航的示例
Aug 23 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编程最快明白》第四讲:日期、表单接收、session、cookie
2010/11/01 PHP
php实现有序数组旋转后寻找最小值方法
2018/09/27 PHP
ASP.NET jQuery 实例1(在TextBox里面创建一个默认提示)
2012/01/13 Javascript
javascript操作css属性
2013/12/30 Javascript
jquery设置text的值示例(设置文本框 DIV 表单值)
2014/01/06 Javascript
基于Jquery实现表单验证
2020/07/20 Javascript
Grunt入门教程(自动任务运行器)
2015/08/06 Javascript
jQuery实现图片渐入渐出切换展示效果
2015/08/15 Javascript
前端性能优化及技巧
2016/05/06 Javascript
BootStrap按钮标签及基本样式
2016/11/23 Javascript
JS判断两个对象内容是否相等的方法示例
2017/04/10 Javascript
w3c编程挑战_初级脚本算法实战篇
2017/06/23 Javascript
javascript 开发之网页兼容各种浏览器
2017/09/28 Javascript
Angularjs过滤器实现动态搜索与排序功能示例
2017/12/13 Javascript
在vue-cli项目中使用bootstrap的方法示例
2018/04/21 Javascript
js for终止循环 跳出多层循环
2018/10/04 Javascript
用VueJS写一个Chrome浏览器插件的实现方法
2019/02/27 Javascript
vue 的 solt 子组件过滤过程解析
2019/09/07 Javascript
webpack的pitching loader详解
2019/09/23 Javascript
细述Javascript的加法运算符的具体使用
2019/10/18 Javascript
详解Vue.js 可拖放文本框组件的使用
2021/03/03 Vue.js
利用Python实现简单的相似图片搜索的教程
2015/04/23 Python
在Python的Django框架中为代码添加注释的方法
2015/07/16 Python
Python+MongoDB自增键值的简单实现
2016/11/04 Python
TensorFlow Session使用的两种方法小结
2018/07/30 Python
详解Python数据可视化编程 - 词云生成并保存(jieba+WordCloud)
2019/03/26 Python
python爬虫 urllib模块发起post请求过程解析
2019/08/20 Python
python实现的config文件读写功能示例
2019/09/24 Python
python读写文件write和flush的实现方式
2020/02/21 Python
使用python求解二次规划的问题
2020/02/29 Python
浅谈pandas.cut与pandas.qcut的使用方法及区别
2020/03/03 Python
更新升级python和pip版本后不生效的问题解决
2020/04/17 Python
python如何实现word批量转HTML
2020/09/30 Python
运动会四百米广播稿
2014/01/19 职场文书
公证委托书模板
2014/04/03 职场文书
英文演讲稿开场白
2014/08/25 职场文书