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 表单验证插件formValidation实现个性化错误提示
Jun 23 Javascript
js跟随滚动条滚动浮动代码
Dec 31 Javascript
IE8 中使用加速器(Activities)
May 14 Javascript
让textarea自动调整大小的js代码
Apr 12 Javascript
jQuery 阴影插件代码分享
Jan 09 Javascript
使用js检测浏览器是否支持html5中的video标签的方法
Mar 12 Javascript
a标签的href与onclick事件的区别详解
Nov 12 Javascript
Google 爬虫如何抓取 JavaScript 的内容
Apr 07 Javascript
详解JSON Web Token 入门教程
Jul 30 Javascript
详解angular2 控制视图的封装模式
Dec 27 Javascript
VUE简单的定时器实时刷新的实现方法
Jan 20 Javascript
JavaScript实现刮刮乐效果
Nov 01 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去除重复字的实现代码
2011/09/16 PHP
php中$_POST与php://input的区别实例分析
2015/01/07 PHP
RR vs IO BO3 第二场2.13
2021/03/10 DOTA
鼠标移动到图片名上,显示图片的简单实例
2013/07/14 Javascript
使用jquery prev()方法找到同级的前一个元素
2014/07/11 Javascript
jQuery使用元素属性attr赋值详解
2015/02/27 Javascript
jquery拖拽排序简单实现方法(效果增强版)
2016/02/16 Javascript
AngularJS中的缓存使用
2017/01/11 Javascript
Angularjs上传文件组件flowjs功能
2017/08/07 Javascript
JavaScript中EventLoop介绍
2018/01/22 Javascript
vue中的watch监听数据变化及watch中各属性的详解
2018/09/11 Javascript
jquery实现点击弹出对话框
2020/02/08 jQuery
ES6 Iterator遍历器原理,应用场景及相关常用知识拓展详解
2020/02/15 Javascript
JS实现可控制的进度条
2020/03/25 Javascript
微信小程序实现菜单左右联动
2020/05/19 Javascript
[04:44]DOTA2英雄梦之声_第12期_矮人直升机
2014/06/21 DOTA
[51:10]VP vs VGJ.S 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Python使用py2exe打包程序介绍
2014/11/20 Python
Python中线程编程之threading模块的使用详解
2015/06/23 Python
利用Python如何生成hash值示例详解
2017/12/20 Python
Django中url的反向查询的方法
2018/03/14 Python
python 实现图片旋转 上下左右 180度旋转的示例
2019/01/24 Python
python脚本当作Linux中的服务启动实现方法
2019/06/28 Python
Python 实现递归法解决迷宫问题的示例代码
2020/01/12 Python
pytorch学习教程之自定义数据集
2020/11/10 Python
Book Depository澳大利亚:世界领先的专业在线书店之一
2018/12/27 全球购物
以下为Windows NT 下的32 位C++程序,请计算sizeof 的值
2016/12/07 面试题
零件设计自荐信范文
2013/11/27 职场文书
触摸春天教学反思
2014/02/03 职场文书
土木工程师职业规划范文
2014/03/07 职场文书
2014最新房贷收入证明范本
2014/09/12 职场文书
四风专项整治工作情况汇报
2014/10/28 职场文书
高三毕业评语
2014/12/31 职场文书
《搭石》教学反思
2016/02/18 职场文书
html+css实现滚动到元素位置显示加载动画效果
2021/08/02 HTML / CSS
《最终幻想14》6.01版本4月5日推出 追加新任务新道具
2022/04/03 其他游戏