-
-
Save jhades/a8a16ac802db0bdf0e38953fbbaa05dc to your computer and use it in GitHub Desktop.
form = this.fb.group({ | |
title: ['', { | |
validators: [ | |
Validators.required, | |
Validators.minLength(5), | |
Validators.maxLength(60) | |
], | |
asyncValidators: [courseTitleValidator(this.courses)], | |
updateOn: 'blur' | |
}], | |
releasedAt: [new Date(), Validators.required], | |
category: ['BEGINNER', Validators.required], | |
downloadsAllowed: [false, Validators.requiredTrue], | |
longDescription: ['', [Validators.required, Validators.minLength(3)]] | |
}); |
@Component({ | |
selector: 'form-array-example', | |
templateUrl: 'form-array-example.component.html', | |
styleUrls: ['form-array-example.component.scss'] | |
}) | |
export class FormArrayExampleComponent { | |
form = this.fb.group({ | |
... other form controls ... | |
lessons: this.fb.array([]) | |
}); | |
constructor(private fb:FormBuilder) {} | |
get lessons() { | |
return this.form.controls["lessons"] as FormArray; | |
} | |
} |
<button mat-mini-fab (click)="addLesson()"> | |
<mat-icon class="add-course-btn">add</mat-icon> | |
</button> |
addLesson() { | |
const lessonForm = this.fb.group({ | |
title: ['', Validators.required], | |
level: ['beginner', Validators.required] | |
}); | |
this.lessons.push(lessonForm); | |
} |
deleteLesson(lessonIndex: number) { | |
this.lessons.removeAt(lessonIndex); | |
} |
<h3>Add Course Lessons:</h3> | |
<div class="add-lessons-form" [formGroup]="form"> | |
<ng-container formArrayName="lessons"> | |
<ng-container *ngFor="let lessonForm of lessons.controls; let i = index"> | |
<div class="lesson-form-row" [formGroup]="lessonForm"> | |
<mat-form-field appearance="fill"> | |
<input matInput | |
formControlName="title" | |
placeholder="Lesson title"> | |
</mat-form-field> | |
<mat-form-field appearance="fill"> | |
<mat-select formControlName="level" | |
placeholder="Lesson level"> | |
<mat-option value="beginner">Beginner</mat-option> | |
<mat-option value="intermediate">Intermediate</mat-option> | |
<mat-option value="advanced">Advanced</mat-option> | |
</mat-select> | |
</mat-form-field> | |
<mat-icon class="delete-btn" (click)="deleteLesson(i)"> | |
delete_forever</mat-icon> | |
</div> | |
</ng-container> | |
</ng-container> | |
<button mat-mini-fab (click)="addLesson()"> | |
<mat-icon class="add-course-btn">add</mat-icon> | |
</button> | |
</div> |
@Component({ | |
selector: 'form-array-example', | |
templateUrl: 'form-array-example.component.html', | |
styleUrls: ['form-array-example.component.scss'] | |
}) | |
export class FormArrayExampleComponent { | |
form = this.fb.group({ | |
... other form controls ... | |
lessons: this.fb.array([]) | |
}); | |
constructor(private fb:FormBuilder) {} | |
get lessons() { | |
return this.form.controls["lessons"] as FormArray; | |
} | |
addLesson() { | |
const lessonForm = this.fb.group({ | |
title: ['', Validators.required], | |
level: ['beginner', Validators.required] | |
}); | |
this.lessons.push(lessonForm); | |
} | |
deleteLesson(lessonIndex: number) { | |
this.lessons.removeAt(lessonIndex); | |
} | |
} |
i have an error while trying the lessons.push(), which of the lessons are u referring to, the function or the form element, i gave my function a different name from the form element so im getting a not defined error
For me the error disappears by casting the lessonsForm to FormGroup. To do this I created a method to do the casting and used it in the template.
In the template: <div class="lesson-form-row" [formGroup]="toFormGroup(lessonForm)">
In the class: toFormGroup = (form: AbstractControl) => form as FormGroup;
I am wondering the same
The error Type 'AbstractControl<any, any>' is missing the following properties from type 'FormGroup<any>'
happens when you have in tsconfig.json:
"angularCompilerOptions": {
"strictTemplates": true
},
Solution with pipe (I couldn't manage to make it work with generic pipe like in https://stackoverflow.com/a/69466380/588759):
import { Pipe, PipeTransform } from '@angular/core';
import { AbstractControl, FormGroup } from '@angular/forms';
/**
* https://stackoverflow.com/a/72517767/588759
* https://stackoverflow.com/a/67059770/588759
*/
@Pipe({
name: 'formGroup',
})
export class FormGroupPipe implements PipeTransform {
transform(value: AbstractControl): FormGroup<(typeof value)['value']> {
return value as FormGroup<(typeof value)['value']>;
}
}
and use as [formGroup]="lessonForm | formGroup"
Change:
<div class="lesson-form-row" [formGroup]="lessonForm">
to
<div class="lesson-form-row" [formGroupName]="i">