#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
помощью .