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 相关文章推荐
js 单引号 传递方法
Jun 22 Javascript
自己动手制作jquery插件之自动添加删除行的实现
Oct 13 Javascript
javascript随机将第一个dom中的图片添加到第二个div中示例
Oct 08 Javascript
JS获取各种浏览器窗口大小的方法
Jan 14 Javascript
Iframe实现跨浏览器自适应高度解决方法
Sep 02 Javascript
使用Javascript简单实现图片无缝滚动
Dec 05 Javascript
javascript中递归函数用法注意点
Jul 30 Javascript
详解vue+vueRouter+webpack的简单实例
Jun 17 Javascript
详解Vue微信公众号开发踩坑全记录
Aug 21 Javascript
jquery实现倒计时小应用
Sep 19 jQuery
vue-cli3使用 DllPlugin 实现预编译提升构建速度
Apr 24 Javascript
js图数据结构处理 迪杰斯特拉算法代码实例
Sep 11 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
超神学院:鹤熙已踏入神圣领域,实力不比凯莎弱
2020/03/02 国漫
PHP 5.5 创建和验证哈希最简单的方法详解
2013/11/07 PHP
codeigniter自带数据库类使用方法说明
2014/03/25 PHP
php中mysql连接和基本操作代码(快速测试使用,简单方便)
2014/04/25 PHP
PHP实现懒加载的方法
2015/03/07 PHP
phpstudy2018升级MySQL5.5为5.7教程(图文)
2018/10/24 PHP
javascript 禁止复制网页
2009/06/11 Javascript
中国地区三级联动下拉菜单效果分析
2012/11/15 Javascript
原生js实现模拟滚动条
2015/06/15 Javascript
学习使用grunt来打包JavaScript和CSS程序的教程
2016/01/04 Javascript
JS实现漂亮的时间选择框效果
2016/08/20 Javascript
javascript实现鼠标点击页面 移动DIV
2016/12/02 Javascript
jQuery 常见小例汇总
2016/12/14 Javascript
js微信支付实现代码
2016/12/22 Javascript
jQuery对table表格进行增删改查
2020/12/22 Javascript
js弹出窗口简单实现代码
2017/03/22 Javascript
用Nodejs搭建服务器访问html、css、JS等静态资源文件
2017/04/28 NodeJs
element ui table(表格)实现点击一行展开功能
2018/12/04 Javascript
vue2.0中set添加属性后视图不能更新的解决办法
2019/02/22 Javascript
python使用pymysql实现操作mysql
2016/09/13 Python
Windows平台Python连接sqlite3数据库的方法分析
2017/07/12 Python
微信跳一跳游戏python脚本
2020/04/01 Python
numpy实现合并多维矩阵、list的扩展方法
2018/05/08 Python
详解Python连接MySQL数据库的多种方式
2019/04/16 Python
python使用mitmproxy抓取浏览器请求的方法
2019/07/02 Python
Python generator生成器和yield表达式详解
2019/08/08 Python
使用pyqt 实现重复打开多个相同界面
2019/12/13 Python
python import 上级目录的导入
2020/11/03 Python
python复合条件下的字典排序
2020/12/18 Python
CSS3制作炫酷带方向感应的鼠标滑过图片3D动画
2016/03/16 HTML / CSS
自我评价怎么写好呢?
2013/12/05 职场文书
三严三实对照检查材料
2014/08/25 职场文书
中学生运动会通讯稿大全
2014/09/18 职场文书
2014年平安创建工作总结
2014/11/24 职场文书
2015年仓库工作总结
2015/04/09 职场文书
如何使用Tkinter进行窗口的管理与设置
2021/06/30 Python