У меня простая ситуация. Существует HTML-форма с двумя полями:
Я хочу, чтобы lastName
что-то изменило, когда пользователь изменит firstName
,Я реализовал это через valueChanges, наблюдаемые в Angular (8).
Кроме того, у меня есть две подписки для прослушивания и регистрации изменений:
- одна на всю форму
- одна на
lastName
Вот как это реализовано:
ngOnInit(){
this.form = new FormGroup({
firstName: new FormControl('', {updateOn: 'blur'}),
lastName: new FormControl('', {updateOn: 'blur'}),
});
this.form.get('lastName').valueChanges.subscribe(value => console.log('lastName', value));
this.form.valueChanges.subscribe(value => console.log('Value', value));
this.form.get('firstName').valueChanges
.subscribe(firstName => {
this.form.get('lastName').setValue(`firstName ${firstName} ${new Date().getMilliseconds()}`);
});
}
В общем - с точки зрения пользователя - это ведет себя как ожидалось. Пользователь меняет firstName
, а затем lastName
меняет сам.
Но когда я смотрю журнал консоли, вот что я получил:
lastName firstName test 850
Value > {firstName: "test", lastName: "firstName test 850"}
Value > {firstName: "test", lastName: "firstName test 850"}
Я ожидал, что два журнала целиком, но один с первым именем изменен, а второй с lastNameизменилось. Примерно так:
Value > {firstName: "test", lastName: ""}
lastName firstName test 850
Value > {firstName: "test", lastName: "firstName test 850"}
Вот целый пример stackblitz .
Хорошо, поэтому, когда я изменил способ, я обновляю lastName
из этого:
this.form.get('lastName').setValue(`firstName ${firstName} ${new Date().getMilliseconds()}`);
на это:
setTimeout(() => this.form.get('lastName').setValue(`firstName ${firstName} ${new Date().getMilliseconds()}`));
тогда журналы в порядке, который я ожидал:
Value > {firstName: "test", lastName: ""}
lastName firstName test 850
Value > {firstName: "test", lastName: "firstName test 850"}
Однако, setTimeout
кажется хитрым взломом здесь,Вот весь код на stackblitz .
Вопрос: что здесь происходит? Почему FormGroups работает таким образом? Есть ли шаблон для обработки таких событий в Angular (когда одна форма влияет на другую)?