Tengo dos componentes Padre e Hijo.
Parent almacena el estado del formGroup utilizado en el componente secundario. Cada vez que recibo nuevos datos de una fuente externa, paso estos datos a través de la plantilla y construyo un nuevo FormGroup y decido en función de una propiedad si FormGroup está habilitado o deshabilitado. Los nuevos datos se cambian como quiero, pero el estado deshabilitado/habilitado no.
Mi código:
Componente hijo
@Input() edvForm: FormGroup; @Input() isBlocMainSupport: boolean; @Input() data: Data; ngOnChanges(changes: SimpleChanges): void { this.setForm(); } setForm() { ... this.edvForm.addControl( 'supportType', new FormControl({ value: supportType, disabled: !this.isBlocMainSupport }) ); }Componente principal
edvForm: FormGroup; isBlocMainSupport = true; data: Data; ... ngOnInit(): void { this.sourceEvent$ .pipe(takeUntil(this.destroy$)) .subscribe(newData => { this.newGraphicElements([newData]); }); } ... newGraphicElements(newData: Data[]) { this.reset(); ... this.data = newData[0]; this.isBlocMainSupport = myCondition ? true : false; } ... reset() { this.edvForm = new FormGroup({}); }Plantilla principal
<child-comp *ngIf="isTheRightChild" [data]="data" [edvForm]="edvForm" [isBlocMainSupport]="isBlocMainSupport" ></child-comp>Para resumir, los datos se pasan bien y cambian cada vez que es necesario. Pero, el estado de deshabilitación no se aplica con: "deshabilitado: !this.isBlocMainSupport"
Encontré la solución en github: formGroup disabled()/enable() no funciona justo después de init #22556
El problema es el detector de cambios. El siguiente código está funcionando:
this.changeDetector.detectChanges(); // use it before using disable/enable this.form.controls['name'].disable();