在角2不纯管道(纯= FALSE)坏我的表现?

问题描述 投票:13回答:2

我有一个翻译管,它接受一个字符串作为密钥,从字典返回翻译字符串。该管道是这样的:

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页面上的所有不同的翻译文本。

主要的问题是:这是一件坏事,而且它有对整体性能产生很大的负面影响???

还是有另一种方式来迫使角按需重新评估一切,例如,只有当语言的变化???

angular typescript angular2-directives
2个回答
6
投票

不纯的管道对性能相当的影响,尤其是当他们不喜欢复制,筛选和排序数组不平凡的工作。

不纯管道呼吁每一个变更检测周期,不管是什么。这是明智的高速缓存的结果,如果可能避免一遍又一遍,如果有可能做同样的工作。

当输入值或参数已经改变纯管道只被调用。

如果可能的话,你可以保持管道纯净,而是增加一个额外的参数。更新该参数使管道再次运行。


0
投票

不建议使用不纯的管道。我会影响你的表现。即使源尚未改变它就会被调用。

要看到这一点。

  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> 
© www.soinside.com 2019 - 2024. All rights reserved.