@Pipe({name:'myPipe', pure: false})
我无法理解不纯净的管道,有些管道更好。
请用一个简单而基本的例子来解释我?
答案 0 :(得分:41)
仅当Angular检测到值或传递给管道的参数发生变化时,才会调用纯管道。无论值或参数是否发生变化,每个变化检测周期都会调用一个不纯的管道。
这与Angular未检测到的更改相关
在这些情况下,您可能仍希望执行管道。
您应该意识到不纯净的管道容易低效。
例如,当一个数组被传递到管道中进行过滤,排序,......那么这项工作可能会在每次更改检测运行时完成(这通常特别是对于默认的ChangeDetectionStrategy
设置)事件,尽管数组可能会甚至没有改变。
你的管道应该尝试识别这个,例如返回缓存的结果。
答案 1 :(得分:22)
除了之前的回答,我想添加另一个区别:实例数。
假设在HTML代码中多次使用管道。像:
<p> {{'Hello' | translate }}<p>
<p> {{'World' | translate }}<p>
(您可以通过在管道的构造函数中生成随机ID并在两者中进行打印来查看:constructor
和transform
方法)
由于纯管道(或通常是纯函数)确实(应该)没有任何副作用,所以相同的纯代码可以重复使用多次而不用担心。似乎这就是纯管道只被实例化的原因。
OBS:这在我的角度4.0环境中有效。
答案 2 :(得分:3)
在angular
中,pipe
可以用作pure
和impure
什么是纯净管或不纯净管?
简单地说,
impure-pipe
适用于component
中的每一项更改
pure-pipe
仅在加载component
时有效。
@Pipe({
name: 'sort',
pure: false //true makes it pure and false makes it impure
})
export class myPipe implements PipeTransform {
transform(value: any, args?: any): any {
//your logic here and return the result
}
}
<div> {{ arrayOfElements | sort }}<div>
使用不纯管道时要小心,因为如果使用不当,这可能会过度使用系统资源。
答案 3 :(得分:1)
纯净和不纯净管道
纯管道是仅在将“ PURE CHANGE”更改为“ 检测到输入值。
默认情况下,管道是纯管道。
因此,无论源是否更改,每次都会执行不纯管道。这会导致性能下降。 这就是为什么不建议使用管道过滤数据的原因。
使管道不纯:
name: 'empFilter',
pure: false // default is set to true.
})
export class EmpFilterPipe implements PipeTransform {
transform(employees: Employee[], searchValue?: string): Employee[] {
}
}
<input type="text" [(ngModel)]="searchValue">
<button (click)="changeData()"></button>
changeData(): void{
this.employees[0].name = "SOMETHING ELSE";
}
<div *ngFor="let emp of employees | empFilter : searchValue">
{{emp.name}}
</div>
NOTE : if pipe is pure and employees data is changed using method "changeData()" - It will not detect the changes .
Since input value to the EmpFilterPipe is Object & reference of "employees" has not been changed.
答案 4 :(得分:0)
不纯管道的示例
a。异步管道
b。 JsonPipe和SlicePipe
.ts文件
*.csv
*.pkl
.html文件
import { PipeTransform, Pipe } from '@angular/core';
import { User } from './User';
// Pipe
@Pipe({
name: 'filter',
pure: true ----> 'Default is true'
})
export class FilterPipe implements PipeTransform {
transform(users: User[], searchTerm: string): User[] {
if (!users || !searchTerm) {
return users;
}
return users.filter(user => user.name.toLowerCase()
.indexOf(searchTerm.toLowerCase()) !== -1);
}
}