#angular #rxjs #rxjs-observables #angular-observable
Вопрос:
Я получаю ошибку RangeError: Максимальный размер стека вызовов превысил сообщение в консоли, когда я что-то вводил в один из этих входов
app.component.html
<div class="container-wrap">
<div class="container">
<input type="number" [formControl]="input1">
<input type="number" [formControl]="input2">
</div>
</div>
приложение.компонент.ts
constructor() { }
input1:FormControl=new FormControl();
input2:FormControl=new FormControl();
ngOnInit(): void {
this.input1.valueChanges
.pipe(tap(value=>{
this.input2.setValue(value);
})).subscribe();
this.input2.valueChanges
.pipe(tap(value=>{
this.input1.setValue(value);
})).subscribe();
}
Похоже, что ввод одного из моих входных данных вызывает бесконечный цикл изменения значений в приложении.
Я хочу, чтобы при вводе iput1 что-то вводилось в input2, а также при вводе input2 это изменит ввод в input1.
как это исправить?
Комментарии:
1. возможно, вам потребуется установить «другое» входное значение условно, только если другое входное значение отличается от того, которое вы хотите установить. И вам нужно добавить это условие в обе ваши
valueChanges
подписки2. вы устанавливаете значение (которое также вызовет изменение значения) каждый раз, когда происходит изменение значения. Таким образом, вы создаете бесконечный цикл. Какова цель этого?
3. @eko Я хочу создать приложение для конвертации валют, в котором изменение обоих входных значений приведет к изменению других входных значений
Ответ №1:
Вы можете использовать a FormGroup
, содержащий ваши два FormControl
.
С a FormBuilder
это будет выглядеть так:
constructor(formBuilder: FormBuilder) {}
ngOnInit(): void {
this.formGroup = this.formBuilder.group({
inputA: this.input1,
inputB: this.input2
});
this.formGroup.valueChanges.subscribe(values => [switch values here]);
}
Ответ №2:
Вы можете передать дополнительный аргумент setValue
, который должен остановить запуск изменений значений для редактируемого значения.
this.input1.valueChanges
.pipe(tap(value=>{
this.input2.setValue(value, { emitEvent: false });
})).subscribe();
this.input2.valueChanges
.pipe(tap(value=>{
this.input1.setValue(value, { emitEvent: false });
})).subscribe();
Ответ №3:
Ошибка возникает из-за бесконечного цикла, вызванного вашей подпиской на изменение значений, после того, как одно изменение ввода приведет к изменению второго входного значения, затем прослушиватель изменения второго значения запустит первое, и цикл продолжится, вы можете исправить это, добавив значение emitEvent: false в заданное значение элемента управления формой
this.input2.setValue(value, {emitEvent: false});