Почему изменяется BehaviorSubject при редактировании входных данных [(ngModel)] формы без отправки формы?

#angular #rxjs

#angular #rxjs

Вопрос:

У меня есть форма, которая загружает информацию о пользователе из BehaviorSubject. Если я редактирую какие-либо входные данные в этой форме и перехожу со страницы, НЕ нажимая кнопку отправить, информация о пользователе обновляется в теме независимо.

Я не понимаю, почему тема обновляется, когда я не вызвал next () для BehaviorSubject.

=== КЛАСС ОБЪЕКТА ===

 userDataReceiver$: Observable<UserModel>;
private userDataObserver = new BehaviorSubject(null);

constructor() {
    this.userDataReceiver$ = this.userDataObserver.asObservable();
}

 sendUserDataToSubscriber(data: UserModel) {
    this.userDataObserver.next(data);
}
  

===ПОЛЬЗОВАТЕЛЬСКИЙ КЛАСС ===

 userDataReceiver: Subscription;

ngOnInit() {
    this.userDataReceiver = this.observerService.userDataReceiver$
    .subscribe(res => this.user = res);
}

ngOnDestroy() {
      this.userDataReceiver.unsubscribe();
}
  

this.user используется в форме на html-странице для загрузки / сохранения пользовательских данных. Если входные данные редактируются на html-странице без сохранения формы, переход от страницы все равно приведет к обновлению пользовательского объекта. При переходе обратно на html-страницу отобразится обновленный пользовательский ввод.

Ответ №1:

Похоже, что ваши элементы управления формой привязаны к свойствам объекта UserModel, создаваемого BehaviorSubject. Таким образом, изменение значения в элементе управления изменит пользователя. И поскольку у вас есть BehaviorSubject, при следующей подписке вы получите точно такой же объект UserModel с его измененными свойствами.

Если вы не хотите, чтобы форма изменяла пользовательский объект, хранящийся в BehaviorSubject, затем создайте рекурсивную копию объекта и привяжите свойства этой копии к форме.