#javascript #angular #pipe #angular-pipe
Вопрос:
HTML : (component.html)
<input #CostInput class="form-element" formControlName="cost" [value]="replaceDecimal.transform(FormGroup.get('cost').value)">
Труба.ts:
commaLocaleCodes = ['AM', 'AR'];
transform(input) {
if (input) {
const uiLanguage = 'am');
if (this.commaLocaleCodes.indexOf(uiLanguage.toUpperCase()) > -1) {
return input.replace(".", ",");
} else {
return input.replace(",", ".");
}
}
}
Проблема здесь в том, что труба вызывается несколько раз. Если мы отправим ввод = 123,45 . Труба должна вернуться на 123,45 и остановиться. Но фильтр снова вызывается. И снова ввод становится 123.45.
Труба уже чистая. Я хочу понять, сможем ли мы остановить трубу после первой итерации. Спасибо.
Комментарии:
1. Я почти уверен, что канал будет вызываться каждый раз, когда цикл дайджеста пользовательского интерфейса обновляется. Если вы хотите вызвать его один раз, вам придется сделать это в коде компонента и сохранить значение. Конечно, тогда любые будущие изменения на входе не будут отражены в трубе.
Ответ №1:
При использовании стратегии обнаружения изменений по умолчанию функция, привязанная к свойству (или к директиве), будет запускаться для каждого цикла обнаружения изменений. Именно по этой причине не рекомендуется привязывать функции к свойствам и директивам.
Вместо этого вызовите функцию в контроллере, сохраните ответ в переменной и используйте привязку в шаблоне.
Контроллер (*.ts)
export class SomeComponent implements OnInit {
transformedValue: any;
ngOnInit() {
this.transformedValue = this.replaceDecimal.transform(FormGroup.get('cost').value);
}
}
Шаблон (*.html)
<input #CostInput class="form-element" formControlName="cost" [value]="transformedValue">
Комментарии:
1. Попробовал чисто = верно , не сработало. Пришлось прибегнуть к вышеуказанному методу. Сработало ! Спасибо!
2. @Майкл Ди, пожалуйста, не могли бы вы сделать стакблитц? Действительно, это звучит для меня странно использовать
[value]
иformControlName
вместе. Я решаю проблему с помощью размытия и фокусировки, но я не заинтересован в вашем коде