В Angular существует несколько способов отслеживать изменения значений в реактивных формах. Рассмотрим основные подходы с примерами реализации.
Свойство valueChanges
FormGroup является Observable, который эмитит новое значение формы при любом изменении:
this.userForm.valueChanges.subscribe(value => {
console.log('Новое значение формы:', value);
// Здесь можно добавить дополнительную логику обработки
});
Особенности:
Можно подписаться на изменения конкретного поля формы:
this.userForm.get('email').valueChanges.subscribe(email => {
console.log('Новый email:', email);
// Например, валидация на лету или подсказки
});
Для сложных сценариев можно применять операторы RxJS:
import { debounceTime, distinctUntilChanged, filter } from 'rxjs/operators';
this.userForm.get('search').valueChanges.pipe(
debounceTime(300), // Задержка 300мс
distinctUntilChanged(), // Только уникальные значения
filter(text => text.length > 2) // Только если длиннее 2 символов
).subscribe(searchTerm => {
this.searchProducts(searchTerm);
});
Можно отслеживать изменения статуса валидации формы:
this.userForm.statusChanges.subscribe(status => {
console.log('Новый статус формы:', status);
// VALID, INVALID, PENDING, DISABLED
});
combineLatest([
this.userForm.get('firstName').valueChanges,
this.userForm.get('lastName').valueChanges
]).subscribe(([firstName, lastName]) => {
console.log(`Полное имя: ${firstName} ${lastName}`);
});
Важно не забывать отписываться от подписок при уничтожении компонента:
private subscriptions = new Subscription();
ngOnInit() {
this.subscriptions.add(
this.userForm.valueChanges.subscribe(value => {
// логика обработки
})
);
}
ngOnDestroy() {
this.subscriptions.unsubscribe();
}
Альтернативный способ без явной подписки в коде компонента:
formValue$ = this.userForm.valueChanges;
<div *ngIf="formValue$ | async as formValue">
Текущее значение формы: {{ formValue | json }}
</div>
Для FormArray подписка работает аналогично:
this.userForm.get('hobbies').valueChanges.subscribe(hobbies => {
console.log('Изменен список хобби:', hobbies);
});
export class UserFormComponent implements OnInit, OnDestroy {
userForm: FormGroup;
private formSub: Subscription;
constructor(private fb: FormBuilder) {
this.userForm = this.fb.group({
name: ['', Validators.required],
email: ['', [Validators.required, Validators.email]],
notifications: [true]
});
}
ngOnInit() {
this.formSub = this.userForm.get('email').valueChanges.pipe(
debounceTime(500)
).subscribe(email => {
if (this.userForm.get('email').valid) {
this.checkEmailAvailability(email);
}
});
}
ngOnDestroy() {
this.formSub.unsubscribe();
}
}
Подписка на изменения формы в Angular реализуется через Observable valueChanges
и statusChanges
. Для эффективной работы важно:
Правильная работа с подписками на изменения формы - ключ к созданию отзывчивых и эффективных Angular приложений.