【不明觉厉】Angular的 pure pipe (纯管道) 和 impure pipe (非纯管道) 是啥意思?

简介: 【不明觉厉】Angular的 pure pipe (纯管道) 和 impure pipe (非纯管道) 是啥意思?


纯管道和非纯管道是相对于管道所传的参数(如上例的 filterKey)而言的。如果管道是纯管道,只监听基本类型的参数的变化或者引用类型引用的变化(  a primitive input value (String, Number, Boolean, Symbol) or a changed object reference (Date, Array, Function, Object));然而, 对于非纯管道,不管是基本类型参数的改变还是引用类型内部数据变化(而非引用变化)都可以触发管道。

@Pipe({
  name: 'yourPipeName',
  pure: true // default(纯管道:监听基本类型的参数的变化或者引用类型引用的变化)
})
@Pipe({
  name: 'yourPipeName',
  pure: false //(非纯管道:监听所有情况的变化)
})

实验对比

app.component.html

<h1>纯管道:{{obj | moneyPurePipe }}</h1>
<h1>非纯管道:{{obj | moneyImpurePipe }}</h1>
<input type="text" [(ngModel)]=obj.text>

app.component.ts

  obj={
    text :123456.123456
  };

创建两个管道moneyPurePipe和moneyImpurePipe

ng g p  moneyPurePipe
ng g p  moneyImpurePipe

money-pure-pipe.pipe.ts

import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
  name: 'moneyPurePipe',
  pure: true // default(纯管道:监听基本类型的参数的变化或者引用类型引用的变化)
})
export class MoneyPurePipePipe implements PipeTransform {
  transform(value: any, ...args: any[]): any {
    if (value) return (args[0] || '') + parseFloat(parseFloat(value.text).toFixed(2)).toLocaleString() + (args[1] || '');
    else return 0;
    return null;
  }
}

money-impure-pipe.pipe.ts(仅仅只有pure:false的差异)

import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
  name: 'moneyImpurePipe',
  pure: false//(非纯管道:监听所有情况的变化)
})
export class MoneyImpurePipePipe implements PipeTransform {
  transform(value: any, ...args: any[]): any {
    if (value) return (args[0] || '') + parseFloat(parseFloat(value.text).toFixed(2)).toLocaleString() + (args[1] || '');
    else return 0;
    return null;
  }
}

运行看效果

发现了吗?当obj.text发生变化的时候,只有非纯管道监听了数据变化


额外的,如果不想用非纯管道也要能够监听obj的变化,可以采用直接绑定对应的属性名

<h1>纯管道:{{obj.text | moneyPurePipe }}</h1>

直接绑定obj的text属性,对moneyPurePipe管道稍作修改,只监听数值也能达到非纯管道的功效~

只不过这种pipe扩展性就不大了,根据自己项目需求来调整吧~


相关文章
在Angular中创建自定义管道
在Angular中创建自定义管道
132 0
|
Perl
Angular最新教程-第十三节 管道Pipes 自定义管道
Angular最新教程-第十三节 管道Pipes 自定义管道
236 0
Angular最新教程-第十三节 管道Pipes 自定义管道
|
JavaScript
Angular 2.x折腾记 :(11) 写一个挺不靠谱的多少秒/分/时/天前的管道
在写东西的时候发现需要这么一个东西, 而也找不到有人写这个东东,那就自己写一个吧
157 0
|
JSON Linux 数据格式
Angular 2.x折腾记 :(5) 动手实现一个自定义管道
管道这东西,可以让用户的体验变得好,也可以省去我们一些重复性的工作; 官方的内置管道就不解释了,自行看文档吧
239 0
|
JSON API 数据格式
【Angular教程】自定义管道
【Angular教程】自定义管道
292 0
【Angular教程】自定义管道
|
JSON 前端开发 JavaScript
Angular最新教程-第十二节 管道Pipes 内置管道
Angular最新教程-第十二节 管道Pipes 内置管道
423 0
|
JavaScript 前端开发
Angular管道PIPE介绍
PIPE,翻译为管道。Angular 管道是编写可以在HTML组件中声明的显示值转换的方法。Angular 管道之前在 AngularJS 中被称为过滤器,从 Angular 2开始就被称为管道。管道将数据作为输入并将其转换为所需的输出。
345 0
|
JavaScript
Angular4总结(四)—— 数据绑定,响应式,管道
数据绑定 angular4中默认的数据绑定都是单向的。可分为: 插值表达式形式(Dom属性绑定) <p>{{test}}<p> Dom 属性绑定流程: 控制器中定义了一个属性,值发生了改变 对应的dom的value被附上改变了的值 渲染后的页面上也会出现刚刚的值 这一切操作都和html属性不发生任何关系 html属性绑定,使用中括号 <img [src]="imgUrl"/> //如果没有写这个方括号,angular会把属性右侧的值作为字符串进行赋值,而非表达式 基本Html属性绑定 CSS属性绑定 这种形式是全有或者全无的。
1547 0
|
开发者 前端开发 开发框架
JSF与移动应用,开启全新交互体验!让你的Web应用轻松征服移动设备,让用户爱不释手!
【8月更文挑战第31天】在现代Web应用开发中,移动设备的普及使得构建移动友好的应用变得至关重要。尽管JSF(JavaServer Faces)主要用于Web应用开发,但结合Bootstrap等前端框架,也能实现优秀的移动交互体验。本文探讨如何在JSF应用中实现移动友好性,并通过示例代码展示具体实现方法。使用Bootstrap的响应式布局和组件可以确保JSF页面在移动设备上自适应,并提供友好的表单输入和提交体验。尽管JSF存在组件库较小和学习成本较高等局限性,但合理利用其特性仍能显著提升用户体验。通过不断学习和实践,开发者可以更好地掌握JSF应用的移动友好性,为Web应用开发贡献力量。
203 1