привязываются к вэлью аксессорам и никогда не отвязываются.
поэтому при написании кода следующего вида:
<input [formControl]="form.get(activeId)"/>
...
activeId = 0;
form = this.formBuilder.group({
0: '',
1: '',
2: '',
});
После смены activeId при изменении значения контрола 0 будет обновлено значение инпута, несмотря на то, что контрол поменялся.
По сорсам придумал костыль следующего вида:
<input [formControl]="activeControl$ | async"/>
...
activeId$ = new BehaviorSubject(0);
form = this.formBuilder.group({
0: '',
1: '',
2: '',
});
activeControl$ = this.activeId$.pipe(
distinctUntilChanged(),
map(id => this.form.get(id)),
startWith(null),
pairwise(),
map(([prev, cur]) => {
if (prev) {
(prev as FormControl & { _clearChangeFns: () => void })._clearChangeFns();
}
return cur;
}),
);
В классе FormControl есть непубличный метод _clearChangeFns, который сбрасывает массивы коллбэков контрола, что по сути и нужно.
Кто-нибудь встречал такую проблему? Какие есть варианты решения?
Если посмотреть на исходники, то мы видим, что логика FromControlDirective не предусматривает сброс предыдущего контрола в принципе: https://github.com/angular/angular/blob/362b3e4d03f1ba222e3dd2002a4b85a104453159/packages/forms/src/directives/reactive_directives/form_control_directive.ts#L186
Обсуждают сегодня