我有一个转换管道,它接受一个字符串作为键,并从字典中返回翻译后的字符串。管道看起来像这样:
import {Pipe, PipeTransform} from 'angular2/core';
import {TranslateService} from './translate.service';
@Pipe({
name: 'translate',
pure: false
})
export class TranslatePipe implements PipeTransform {
constructor(private _translateService : TranslateService) {
}
transform(key: string): any {
var translatedText = this._translateService.resources[key];
if (translatedText)
return translatedText;
return key;
}
}
我在模板中使用管道,如下所示:
<div>{{'login_EnterNewPassword'|translate}}</div>
它将在我的HTML中呈现如下:
<div>Please enter a new password</div>
到目前一切尚好!
资源依赖于TranslateService,它拥有一个名为TranslatePipe的字典,其中包含当前语言的翻译。TranslateService的资源通过对服务器的ajax http调用加载,如果用户选择不同的语言,它可以在后台重新加载。
因为当发生这种情况时,我需要我的UI来更新所有文本,所以我将管道的纯属性设置为false。
每件事都很完美,但问题是,管道经常被执行,因为它是不纯的。如果用户输入10个字符的密码,更改跟踪将在每次按下和按下键盘时启动,并且对页面上所有不同的翻译文本执行管道上千次。
主要问题是:这是一件坏事吗?它对整体性能有多大的负面影响?
或者,是否有其他方法可以强制angular按需重新评估所有内容,例如仅当语言发生变化时?
发布于 2016-06-12 10:03:37
不纯净的管道对性能有相当大的影响,特别是当它们执行诸如复制、过滤和排序数组之类的重要工作时。
不纯管道在每个变化检测周期都会被调用,不管是什么。明智的做法是尽可能缓存结果,以避免在可能的情况下一遍又一遍地做相同的工作。
只有当输入值或参数发生更改时,才会调用纯管道。
如果可能,您可以保持管道的纯净,而不是添加一个额外的参数。更新该参数会导致管道再次运行。
发布于 2019-02-10 10:20:26
不建议使用不纯净的管道。我会影响你的表现。即使源代码没有改变,它也会被调用。
来看看这个。
name: 'empFilter',
pure: false
})
export class EmpFilterPipe implements PipeTransform {
private count = 0;
transform(employees: Employee[], searchValue?: string): Employee[] {
console.log(this.count++);
}
}
onMouseOver(): void{
}
<div *ngFor="let emp of employees | empFilter : searchValue"
(mouseover)="onMouseOver()">
{{emp.name}}
</div>
https://stackoverflow.com/questions/36336697
复制相似问题