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 ui dialog ie8出现滚动条的解决方法
Dec 06 Javascript
JavaScript实现两个Table固定表头根据页面大小自行调整
Jan 03 Javascript
使用GruntJS构建Web程序之构建篇
Jun 04 Javascript
关于安卓手机微信浏览器中使用XMLHttpRequest 2上传图片显示字节数为0的解决办法
May 17 Javascript
浅谈JavaScript对象与继承
Jul 10 Javascript
mongoose设置unique不生效问题的解决及如何移除unique的限制
Nov 07 Javascript
解析vue路由异步组件和懒加载案例
Jun 08 Javascript
如何在js代码中消灭for循环实例详解
Jul 29 Javascript
详解ES6中的 Set Map 数据结构学习总结
Nov 06 Javascript
原生js实现each方法实例代码详解
May 27 Javascript
ES6 Generator函数的应用实例分析
Jun 26 Javascript
JavaScript前端页面搜索功能案例【基于jQuery】
Jul 10 jQuery
浅谈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下通过POST还是GET来传值
2008/06/05 PHP
php+xml结合Ajax实现点赞功能完整实例
2015/01/30 PHP
composer.lock文件的作用
2016/02/03 PHP
PHP动态地创建属性和方法, 对象的复制, 对象的比较,加载指定的文件,自动加载类文件,命名空间
2016/05/06 PHP
php生成与读取excel文件
2016/10/14 PHP
PHP实现电商订单自动确认收货redis队列
2017/05/17 PHP
PHP实现的mysql操作类【MySQL与MySQLi方式】
2017/10/07 PHP
PHP数组常用函数实例小结
2018/08/20 PHP
YII框架行为behaviors用法示例
2019/04/26 PHP
在Laravel 中实现是否关注的示例
2019/10/22 PHP
读jQuery之八 包装事件对象
2011/06/21 Javascript
Flex通过JS获取客户端IP和计算机名的实例代码
2013/11/21 Javascript
JS实现样式清新的横排下拉菜单效果
2015/10/09 Javascript
谈谈Jquery中的children find 的区别有哪些
2015/10/19 Javascript
80%应聘者都不及格的JS面试题
2017/03/21 Javascript
AngularJS 验证码60秒倒计时功能的实现
2017/06/05 Javascript
jquery.rotate.js实现可选抽奖次数和中奖内容的转盘抽奖代码
2017/08/23 jQuery
浅谈Vue下使用百度地图的简易方法
2018/03/23 Javascript
Vue实现手机扫描二维码预览页面效果
2020/05/28 Javascript
查找Vue中下标的操作(some和findindex)
2020/08/12 Javascript
[01:25]DOTA2超级联赛专访iG 将调整状态找回自己
2013/06/05 DOTA
Python中使用装饰器时需要注意的一些问题
2015/05/11 Python
python使用筛选法计算小于给定数字的所有素数
2018/03/19 Python
Python中Flask-RESTful编写API接口(小白入门)
2019/12/11 Python
Python列表切片常用操作实例解析
2020/03/10 Python
python解释器安装教程的方法步骤
2020/07/02 Python
英国排名第一的最新设计师品牌手表独立零售商:TIC Watches
2016/09/24 全球购物
施华洛世奇澳大利亚官网:SWAROVSKI澳大利亚
2017/01/06 全球购物
百丽国际旗下购物网站:优购
2017/02/28 全球购物
秘鲁购物网站:Linio秘鲁
2017/04/07 全球购物
英国手机壳购买网站:Case Hut
2019/04/11 全球购物
银行实习人员自我鉴定
2013/09/22 职场文书
小学生综合素质评语
2014/04/23 职场文书
2016年大学生寒假社会实践心得体会
2015/10/09 职场文书
pytorch 中nn.Dropout的使用说明
2021/05/20 Python
Windows server 2012 配置Telnet以及用法详解
2022/04/28 Servers