Mr_*_*ect 41 angular-pipe angular
@Pipe({name:'myPipe', pure: false})
Run Code Online (Sandbox Code Playgroud)
我无法理解不纯净的管道,有些用纯管道更好.
请用一个简单而基本的例子来解释我?
Gün*_*uer 56
仅当Angular检测到值的更改或传递给管道的参数时,才会调用纯管道.无论值或参数是否发生变化,每个变化检测周期都会调用一个不纯的管道.
这与Angular未检测到的更改相关
在这些情况下,您可能仍希望执行管道.
您应该意识到不纯的管道容易低效.例如,当一个数组被传递到管道中进行过滤,排序,......那么这项工作可能会在每次更改检测运行时完成(这通常特别是使用默认ChangeDetectionStrategy设置)事件,尽管数组甚至可能没有更改.你的管道应该尝试识别这个,例如返回缓存的结果.
Dac*_*ian 30
除了之前的答案,我想添加另一个区别:实例数.
假设在HTML代码中多次使用管道.喜欢:
<p> {{'Hello' | translate }}<p>
<p> {{'World' | translate }}<p>
Run Code Online (Sandbox Code Playgroud)
(你可以通过在管道的构造函数中生成一个随机id并在两者中打印它来看到这一点:constructor和transform方法)
由于纯管道(或通常是纯函数)确实(应该)没有任何副作用,所以相同的纯代码可以重复使用任何次数而不用担心.似乎这就是纯管道只被实例化一次的原因.
OBS:这在我的角度4.0环境中有效.
在中angular,a 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
}
}
Run Code Online (Sandbox Code Playgroud)
<div> {{ arrayOfElements | sort }}<div>
Run Code Online (Sandbox Code Playgroud)
使用不纯的管道时要小心,因为如果使用不当,这可能会过度使用系统资源。
纯和不纯管道
纯管道是仅在检测到输入值的“纯更改”时才执行的管道。
默认情况下,管道是纯管道。
因此,无论源是否更改,每次都会执行不纯的管道。这会导致性能不佳。这就是为什么不建议使用管道过滤数据的原因。
使管道不纯:
name: 'empFilter',
pure: false // default is set to true.
})
export class EmpFilterPipe implements PipeTransform {
transform(employees: Employee[], searchValue?: string): Employee[] {
}
}
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)
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.
Run Code Online (Sandbox Code Playgroud)
不纯管道的示例
A。异步管道
b. JsonPipe 和 SlicePipe
.ts 文件
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);
}
}
Run Code Online (Sandbox Code Playgroud)
.html 文件
<input type="text" [(ngModel)]="searchTerm" placeholder="Enter name" >
<button (click)="changeProperty()">change by Property</button>
<button (click)="changeReference()">change by Reference</button>
<ul>
<li *ngFor="let user of users | filter:searchTerm">{{user.name}} </li>
</ul>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
23288 次 |
| 最近记录: |