Почему все значения valueChanges запускаются одновременно, когда взаимодействует только с одним formControl?

У меня есть 2 поля формы, которые представляют собой средства выбора даты, простую форму «до» и «от».

Проблема в том, что valueChanges в приведенном ниже коде срабатывает для обоих элементов управления формы, независимо от того, с каким средством выбора даты взаимодействовал пользователь. «Другой» элемент управления формы, с которым не взаимодействовали, всегда пуст.

Таким образом, независимо от того, какую дату вы выберете, функция addDateFilterToRoute(changes) запускается дважды. Я не понимаю, почему.

HTML

<div class="datepicker-container">
  <div class="form-group">

    <form-input-datepicker-dropdown
      [group]="form"
      controlName="deliveryFrom"
    ></form-input-datepicker-dropdown>

  </div>
  <div class="form-group">

    <form-input-datepicker-dropdown
      [group]="form"
      controlName="deliveryTo"
    ></form-input-datepicker-dropdown>

  </div>
</div>

КОМПОНЕНТ TS

  ngOnInit(): void {
    this.buildForm();
    this.handleFormChanges();
  }


  buildForm(): void {
    this.form = this.fb.group({
      deliveryFrom: '',
      deliveryTo: ''
    });
  }


  handleFormChanges(): void {
    this.form
      .get('deliveryFrom')
      .valueChanges.pipe(takeUntil(this.unsubscribe$))
      .subscribe(changes => this.addDateFilterToRoute(changes, 'deliveryFrom', true));

    this.form
      .get('deliveryTo')
      .valueChanges.pipe(takeUntil(this.unsubscribe$))
      .subscribe(changes => this.addDateFilterToRoute(changes, 'deliveryTo', false));
  }

Поэтому, когда я меняю deliveryFrom, он вызывает this.addDateFilterToRoute(changes, 'deliveryTo', false)


person Weblurk    schedule 18.11.2019    source источник
comment
Итак, когда вы меняете deliveryFrom, он вызывает this.addDateFilterToRoute(changes, 'deliveryTo', false)?   -  person martin    schedule 18.11.2019
comment
Это правильно!   -  person Weblurk    schedule 18.11.2019
comment
Это странно, может быть, <form-input-datepicker-dropdown> как-то возится со значениями формы? Почему он все равно принимает параметр [group]="form", когда он должен установить только один FormControl.   -  person martin    schedule 18.11.2019
comment
form-input-datepicker-dropdown это ваш пользовательский ввод формы? Не могли бы вы предоставить метод addDateFilterToRoute и файл form-input-datepicker-dropdown component.ts?   -  person Nikolay Zatonatskiy    schedule 18.11.2019
comment
Вы не получаете никаких ошибок в консоли?   -  person mpro    schedule 18.11.2019
comment
если вы используете setValue, обязательно добавьте {emitEvent:false}, stackoverflow.com/questions/39857486/   -  person Eliseo    schedule 18.11.2019


Ответы (1)


Вы немного напутали с созданием реактивной формы, создав одну группу форм с двумя элементами управления внутри, однако вы поместили эти два элемента управления в каждое средство выбора данных как группу в представлении. Все, что вам нужно, это переместить группу из средства выбора даты. Это не должно генерировать дополнительные вызовы для каждого элемента управления:

<div [formGroup]="form" class="datepicker-container">
  <div class="form-group">
    <form-input-datepicker-dropdown
      [formControlName]="deliveryFrom"
    ></form-input-datepicker-dropdown>
  </div>
  <div class="form-group">
    <form-input-datepicker-dropdown
      [formControlName]="deliveryTo"
    ></form-input-datepicker-dropdown>
  </div>
</div>
person mpro    schedule 18.11.2019