2

My parent component uses a FormGroup and I expect the child components to report value changes to its parent. I try to solve this by using NG_VALUE_ACCESSOR in the child component to allow it to behave as a form field. As I've understood it one should use the 4 following functions

writeValue(value) {
    this.value = value;
}

registerOnChange(fn: any) {
    this.onChange = fn;
}

registerOnTouched(fn: any) {
    this.onTouch = fn;
}

setDisabledState?(isDisabled: boolean): void {
    this.isDisabled = isDisabled;
}

in order to behave as a form field. This is my current non-working solution:

https://stackblitz.com/edit/angular-ivy-tpneik?file=src%2Fapp%2Fapp.component.ts

The current error says:

Error: No value accessor for form control with path: 'ok -> isChecked'

The goal is to have a child component (and possible more) that can report its valuechanges correctly to the parent form in the parent component. How can I approach this problem?

1 Answer 1

2

You have a separate form inside your child, also you are rebuilding your child form there. Just pass the the built nested formgroup to the child and you are good to go. Parent will know what's going on in the child.

Pass the formgroup down as a variable:

<div formGroupName="child">
  <app-form [formGroupChild]="formGroupChild" [myArray]="myArray"></app-form>
</div>

and in the child, grab the array and formgroup, attach a [formGroup] to a div and do your magic!

<div [formGroup]="formGroupChild">
  <div class="container">
    <div *ngFor="let category of myArray" [formGroupName]="category.id">
      <input type="checkbox" formControlName="isChecked">
      <div [style.color]="category.textColor">
        {{ category.name }}
      </div>
    </div>
  </div>
</div>

No need for controlvalueaccessor here :)

Your forked STACKBLITZ

Sign up to request clarification or add additional context in comments.

2 Comments

Thank you!! Would the NG_VALUE_ACCESSOR only be the appropriate choice if the child component consisted of only formcontrols perhaps?
As long as you pass an actual formarray/formgroup/formcontrol as a variable to a child there is no need to implement ng_value_accessor, as they are connected to the parent form, being objects and all, objects being mutable. If you are starting to tinker with custom things, then ng_value_accessor is needed.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.