【不明觉厉】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扩展性就不大了,根据自己项目需求来调整吧~


相关文章
|
3月前
在Angular中创建自定义管道
在Angular中创建自定义管道
16 0
|
Perl
Angular最新教程-第十三节 管道Pipes 自定义管道
Angular最新教程-第十三节 管道Pipes 自定义管道
145 0
Angular最新教程-第十三节 管道Pipes 自定义管道
|
JavaScript
Angular 2.x折腾记 :(11) 写一个挺不靠谱的多少秒/分/时/天前的管道
在写东西的时候发现需要这么一个东西, 而也找不到有人写这个东东,那就自己写一个吧
100 0
|
JSON Linux 数据格式
Angular 2.x折腾记 :(5) 动手实现一个自定义管道
管道这东西,可以让用户的体验变得好,也可以省去我们一些重复性的工作; 官方的内置管道就不解释了,自行看文档吧
153 0
|
JSON API 数据格式
【Angular教程】自定义管道
【Angular教程】自定义管道
203 0
【Angular教程】自定义管道
|
JSON 前端开发 JavaScript
Angular最新教程-第十二节 管道Pipes 内置管道
Angular最新教程-第十二节 管道Pipes 内置管道
323 0
|
JavaScript 前端开发
Angular管道PIPE介绍
PIPE,翻译为管道。Angular 管道是编写可以在HTML组件中声明的显示值转换的方法。Angular 管道之前在 AngularJS 中被称为过滤器,从 Angular 2开始就被称为管道。管道将数据作为输入并将其转换为所需的输出。
194 0
|
JavaScript
Angular4总结(四)—— 数据绑定,响应式,管道
数据绑定 angular4中默认的数据绑定都是单向的。可分为: 插值表达式形式(Dom属性绑定) <p>{{test}}<p> Dom 属性绑定流程: 控制器中定义了一个属性,值发生了改变 对应的dom的value被附上改变了的值 渲染后的页面上也会出现刚刚的值 这一切操作都和html属性不发生任何关系 html属性绑定,使用中括号 <img [src]="imgUrl"/> //如果没有写这个方括号,angular会把属性右侧的值作为字符串进行赋值,而非表达式 基本Html属性绑定 CSS属性绑定 这种形式是全有或者全无的。
1403 0
|
3月前
|
API 开发者 UED
PrimeFaces:JSF的魔法衣橱,解锁UI设计的无限可能!
【8月更文挑战第31天】本文介绍如何结合 JSF(JavaServer Faces)和 PrimeFaces 构建美观且功能强大的现代用户界面。PrimeFaces 提供丰富的 UI 组件库,包括按钮、输入框、数据网格等,支持现代 Web 标准,简化界面开发。文章通过具体示例展示如何使用 `&lt;p:inputText&gt;` 和 `&lt;p:calendar&gt;` 等组件创建用户表单,并用 `&lt;p:dataTable&gt;` 展示数据集合,提升 JSF 应用的易用性和开发效率。
60 0