Search code examples
angularcontrolsdirectiveaccessor

How to get FormControl instance from ControlValueAccessor


I've the following component:

@Component({
    selector: 'pc-radio-button',
    templateUrl: './radio-button.component.html',
    providers: [
        {provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => FieldRadioButtonComponent), multi: true}
    ]
})
export class RadioButtonComponent implements ControlValueAccessor {
    ...
}

I can assign and alter the value through these inputs:

<pc-radio-button [formControl]="formControl"></pc-radio-button>
<pc-radio-button [formControlName]="inputControlName"></pc-radio-button>

However I need the component to have the direct access to the assigned formControl, as I need to add styles depending on its status.

By creating an @Input() formControl does not solve the problem. As it does not cover the case when form control is assigned via formControlName.


Solution

  • It looks like injector.get(NgControl) is throwing a deprecation warning, so I wanted to chime in with another solution:

    constructor(public ngControl: NgControl) {
      ngControl.valueAccessor = this;
    }
    

    The trick is to also remove NG_VALUE_ACCESSOR from the providers array otherwise you get a circular dependency.

    More information about this is in this talk by Kara Erickson of the Angular team.