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