我有一个翻译管,它接受一个字符串作为密钥,从字典返回翻译字符串。该管道是这样的:
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>
到现在为止还挺好!
该TranslatePipe依赖于TranslateService,持有一本字典称为资源与当前语言的翻译。该TranslateService的资源被加载与AJAX HTTP调用到服务器,它可以得到重新加载在幕后,如果用户选择不同的语言。
因为我需要我的UI更新所有文本时出现这种情况,我有管的纯属性设置为false。
一切都运行完美,但事情是,管得到执行,很多时候,因为它是不纯的。如果用户输入10个字符的密码,更改跟踪开始在每个键下和键起,管被执行的时间为hundres页面上的所有不同的翻译文本。
主要的问题是:这是一件坏事,而且它有对整体性能产生很大的负面影响???
还是有另一种方式来迫使角按需重新评估一切,例如,只有当语言的变化???
不纯的管道对性能相当的影响,尤其是当他们不喜欢复制,筛选和排序数组不平凡的工作。
不纯管道呼吁每一个变更检测周期,不管是什么。这是明智的高速缓存的结果,如果可能避免一遍又一遍,如果有可能做同样的工作。
当输入值或参数已经改变纯管道只被调用。
如果可能的话,你可以保持管道纯净,而是增加一个额外的参数。更新该参数使管道再次运行。
不建议使用不纯的管道。我会影响你的表现。即使源尚未改变它就会被调用。
要看到这一点。
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>