angular - Inget värdetillgångsfel när man använder mat-slide-toggle
Jag använder Angular reaktiva formulär, formgruppen initieras i föräldrakomponenten och formkontrollerna finns i barnkomponenterna.
Problemet är att jag får följande felmeddelande när jag öppnar sidan:
ERROR Error: No value accessor for form control with unspecified name attribute
För teständamål försökte jag ersätta mat-slide-toggle med en input checkbox och felet försvinner, varför klagar det med slidern, jag kan inte förstå.
Här är ett liknande exempel:
Föräldramodul
@NgModule({
...
declarations: [ParentComponent],
imports: [
...,
MatSlideToggleModule,
]
})
export class ParentModule {}
Föräldrakomponent
@Component({
selector: 'app-parent',
template: `
<form [formGroup]="myFormGroup">
<app-child-a [subscribedControl]="$any(myFormGroup.controls.myOption)"></app-child-a>
</form>
`
})
export class ParentComponent {
public myFormGroup: FormGroup = this._fb.group({
myOption: [true, [Validators.required]],
});
constructor(private _fb: FormBuilder) {}
}
Barn A-komponent
@Component({
selector: 'app-child-a',
template: `
<mat-slide-toggle [formControl]="subscribedControl"></mat-slide-toggle>
`
})
export class ChildAComponent {
@Input() public subscribedControl!: FormControl;
}
Några idéer?
Svar #1
Baserat på det du har lämnat och med tanke på att detta inte är den ursprungliga koden, här är några saker att kontrollera:
- Deklarerar du din barnkomponent i din
ParentModule? Eller importerar du den lämpliga modulen som innehåller den? För i den tillhandahållna koden gör du inte det. (Detta skulle förmodligen generera ett annat fel dock) - Använder du det "reserverade" namnet
formControlsom din barns input-egenskapsnamn? Om så är fallet, ändra det till något annat. T.ex.@Input() control: FormControl.
Å andra sidan är det inte en elegant lösning att vidarebefordra formulärkontrollen själv.
Om du vill använda din ChildComponent som en återanvändbar anpassad formulärkontroll, behöver din komponent implementera ControlValueAccessor-gränssnittet och tillhandahålla det som sådant.
På det här sättet säger du i princip till Angular: "titta, min anpassade kontroll följer de regler som alla andra inbyggda formulärelement följer. Så du kan använda den i formuläret."
Om du implementerar detta gränssnitt och tillhandahåller din komponent som en CVA, behöver du inte skicka formulärkontrollen.
Du kan läsa en detaljerad förklaring i den här artikeln.
Alternativt, om du helt enkelt behöver dela upp formuläret i delformulärskomponenter och inte bryr dig om återanvändbarhet och portabilitet, kan du använda detta tillvägagångssätt.
Svar #2
Jag stötte på samma problem, men när jag skrev enhetstester för min komponent. Jag hade detta i mallen:
<mat-slide-toggle
color="primary"
[class.mb-m]="!areThereAnyPhotos"
[formControl]="$any(productClassPhotosFG.get('includePanelInTheReport'))"
>
{{ t('include-this-panel-in-the-report') }}
</mat-slide-toggle>
Och när jag körde testerna fick jag detta:
Error: NG01203: No value accessor for form control unspecified name attribute. Find more at https://angular.io/errors/NG01203
error properties: Object({ code: -1203 })
Lösningen var att importera MatSlideToggleModule till min TestBed:
await TestBed.configureTestingModule({
imports: [MatSlideToggleModule],
...
Detta åtgärdade felet.
