Являются ли нечистые трубы в Angular 2 (pure = false) плохими для моей работы?

У меня есть переводный канал, который принимает строку как ключ и возвращает переведенную строку из словаря. Труба выглядит так:

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 загружается с помощью HTTP-вызова ajax на сервер, и его можно перезагрузить за кулисами, если пользователь выбирает другой язык.

Поскольку мне нужен мой пользовательский интерфейс, чтобы обновлять все тексты, когда это происходит, я установил чистое свойство pipe в false.

Все работает отлично, но дело в том, что труба выполняется очень часто, так как она нечиста. Если пользователь вводит пароль с 10 символами, отслеживание изменений начинается с каждого нажатия клавиш и нажатия клавиш, и канал получает исполняемые hundres раз для всех разных переведенных текстов на странице.

Основной вопрос: неужели это плохо, и имеет ли он какое-то негативное влияние на общую производительность?

Или существует другой способ заставить angular переоценить все по требованию, например, только при изменении языка.

Ответ 1

Нечистые трубы оказывают значительное влияние на производительность, особенно когда они выполняют нетривиальные работы, такие как копирование, фильтрация и сортировка массивов.

Неисправные трубы вызывают каждый цикл обнаружения изменений, несмотря ни на что. Разумно кэшировать результаты, если это возможно, чтобы избежать повторения одной и той же работы, если это возможно.

Чистые трубы вызывается только при изменении входного значения или параметров.

Если возможно, вы можете сохранить чистый канал и вместо этого добавить дополнительный параметр. Обновление этого параметра приводит к повторному запуску трубопровода.