Запретить вызов подписки на изменение значений для значений, которые были выданы перед подпиской

#angular #rxjs

Вопрос:

Я инициализирую форму в методе writeValue(controlAccessor), в режиме редактирования доступны значения, поэтому я помещаю эти значения сюда(я не могу использовать setValue, потому что до сих пор не знаю, сколько полей).

 this.formGroup = this._formBuilder.group({ fields: this._formBuilder.array([]) });
if (fieldsReturnFromAPI?.length > 0) {
  fieldsReturnFromAPI.forEach((value: any): any => {
    (this.formGroup.controls.fields as FormArray).push(this.createField(value));
  });
}
 

И после некоторых манипуляций с полями, подписывающимися на valueChanges(отсюда вызов onChange для отправки значений родителю).

 this.formGroup.controls.fields.valueChanges
  .pipe(
    distinctUntilChanged(),
    skip(fieldsReturnFromAPI.length), // this is working sometime, but not seems good way
    takeUntil(this.ngUnsubscribe))
  .subscribe((): void => {
    this.updateHiddenFields();
    this.onChange(this.formGroup?.getRawValue().fields);
 });
 

Проблема в том, что это делает форму грязной. Я должен ограничить вызовы диапазонов значений для данных, заполняемых программным обеспечением(без ввода пользователя). Я не могу использовать skip(файлы.длина), потому что иногда это работает, а иногда нет.

На самом деле подписка на изменение значения вызывается из метода initializeform push (). Есть ли какой-либо способ/оператор игнорировать значения, которые были отправлены до подписки?

Комментарии:

1. Наблюдаемые объекты работают не так. Любая эмиссия до того, как вы подпишетесь, будет потеряна. Также valueChanges является Subject (не BehaviorSubject или ReplaySubject ), поэтому он не повторит никаких предыдущих выбросов. Так что проблема будет в другом месте. Если вам нужно использовать, например FormControl.setValue() , вы можете пропустить излучение событий с emitEvent: false помощью .