Я отредактировал ваш стек, если будут внесены изменения, он решит вашу проблему, в противном случае вы можете заменить соответствующие файлы приведенным ниже кодом.
Замените html следующим:
<code><form [formGroup]="empForm" (ngSubmit)="onSubmit()">
<div formArrayName="employees">
<div *ngFor="let employee of employees().controls; let empIndex=index">
<div [formGroupName]="empIndex" style="border: 1px solid blue; padding: 10px; width: 600px; margin: 5px;">
{{empIndex}}
First Name :
<input type="text" formControlName="firstName">
<label class="checkbox-inline">
<input type="checkbox" (change)="allow(empIndex, $event)" />ALLOW
</label>
<div>
Last Name:
<input type="text" formControlName="lastName">
<label class="checkbox-inline" *ngFor="let day of days; ">
<input
type="checkbox"
formControlName="{{ day.name }}"
name="{{ day.name }}"
(change)="onChange(empIndex,day.value , $event.target.checked)"
/>{{ day.value }}
</label>
</div>
<button (click)="removeEmployee(empIndex)">Remove</button>
<div formArrayName="skills">
<div *ngFor="let skill of employeeSkills(empIndex).controls; let skillIndex=index">
<div [formGroupName]="skillIndex">
{{skillIndex}}
Start at:
<select (change)="onSelect($event.target.value)" formControlName="skill" id="skill">
<option value="0" selected>Select</option>
<option [value]="i" *ngFor="let type of startTimeArray; let i = index">
{{type}}
</option>
</select>
End at:
<select *ngIf="enableEndTime" formControlName="exp" id="exp">
<option value="0" selected>Select</option>
<option [value]="type" *ngFor="let type of tempEndTimeArray">
{{type}}
</option>
</select>
<button (click)="removeEmployeeSkill(empIndex,skillIndex)">Remove</button>
<pre>{{skillIndex.value |json}}
Добавить время
Отправить
Добавить сотрудника
имя фамилия умение и опыт дней
Form values: {{empForm.value | json}}
и ваш файл TS с этим:
import { Component } from "@angular/core";
import { FormGroup, FormArray, FormBuilder, FormControl } from "@angular/forms";
@Component({
selector: "app-root",
templateUrl: "./app.component.html",
styleUrls: ["./app.component.css"]
})
export class AppComponent {
forTableArray: any = [];
startTimeArray:any=["07:00 AM","08:00 AM", "09:00 AM", "10:00 AM", "11:00 AM", "12:00 PM", "1:00 PM", "2:00 PM", "3:00 PM", "4:00 PM", "5:00 PM", "6:00 PM", "7:00 PM", "8:00 PM"];
endTimeArray:any=["07:00 AM","08:00 AM", "09:00 AM", "10:00 AM", "11:00 AM", "12:00 PM", "1:00 PM", "2:00 PM", "3:00 PM", "4:00 PM", "5:00 PM", "6:00 PM", "7:00 PM", "8:00 PM"];
public tempEndTimeArray: Array<any>;
title = "Nested FormArray Example Add Form Fields Dynamically";
public enableEndTime: boolean = false;
selectedEmp = 0;
empForm: FormGroup;
days: any = [
{
id: 1,
name: "option1",
isActive: false,
value: "option1"
},
{
id: 2,
name: "option2",
isActive: false,
value: "option2"
},
{
id: 3,
name: "option3",
isActive: false,
value: "option3"
}
];
constructor(private fb: FormBuilder) {
this.empForm = this.fb.group({
employees: this.fb.array([])
});
}
employees(): FormArray {
return this.empForm.get("employees") as FormArray;
}
onChange(empIndex, day: string, isChecked: boolean) {
const dayFormArray = (this.empForm.get("employees") as FormArray)
.at(empIndex)
.get("options") as FormArray;
if (isChecked) {
dayFormArray.push(new FormControl(day));
} else {
let index = (dayFormArray.value as []).findIndex(item => item === day);
dayFormArray.removeAt(index);
}
}
newEmployee(): FormGroup {
return this.fb.group({
firstName: "",
lastName: [{value:'', disabled:true}],
option1: [{value:false, disabled:true}],
option2: [{value:false, disabled:true}],
option3: [{value:false, disabled:true}],
skills: this.fb.array([]),
options: this.fb.array([])
});
}
allow(index,event){
const status = event.target.checked ? 'enable' : 'disable' ;
this.employees().at(index).get('lastName')[status]();
this.employees().at(index).get('option1')[status]();
this.employees().at(index).get('option2')[status]();
this.employees().at(index).get('option3')[status]();
if(!event.target.checked){
this.employees().at(index).get('lastName')['reset']();
this.employees().at(index).get('option1')['reset'](false);
this.employees().at(index).get('option2')['reset'](false);
this.employees().at(index).get('option3')['reset'](false);
this.employees().at(index).get('options')['reset']("");
}
}
addEmployee() {
console.log("Adding a employee");
this.employees().push(this.newEmployee());
}
removeEmployee(empIndex: number) {
this.employees().removeAt(empIndex);
}
employeeSkills(empIndex: number): FormArray {
return this.employees()
.at(empIndex)
.get("skills") as FormArray;
}
newSkill(): FormGroup {
return this.fb.group({
skill: "",
exp: "",
fromT:"",
toT:""
});
}
addEmployeeSkill(empIndex: number) {
this.employeeSkills(empIndex).push(this.newSkill());
}
removeEmployeeSkill(empIndex: number, skillIndex: number) {
this.employeeSkills(empIndex).removeAt(skillIndex);
}
onSubmit() {
const employee = this.employees().value.map((_, i: number) =>
this.mapFormEmployee(i)
);
const body = {
displayText: true,
employee: employee
};
this.forTableArray = body;
console.log(body);
}
private mapFormEmployee(
empIndex: number
): {
firstName: string;
lastName: string;
option1: boolean;
option2: boolean;
option3: boolean;
options:[];
skills: { skill: string; exp: string }[];
} {
const employeeFormGroup = this.employees().at(empIndex);
return {
firstName: employeeFormGroup.get("firstName").value,
lastName: employeeFormGroup.get("lastName").value,
option1: employeeFormGroup.get("option1").value,
option2: employeeFormGroup.get("option2").value,
option3: employeeFormGroup.get("option3").value,
options: employeeFormGroup.get("options").value,
skills: employeeFormGroup
.get("skills")
.value.map((_, skillIndex) => this.mapFormSkill(empIndex, skillIndex))
};
}
private mapFormSkill(
empIndex: number,
skillIndex: number
): { skill: string; exp: string } {
const employeeFormGroup = this.employees().at(empIndex);
const skillFormGroup = (employeeFormGroup.get("skills") as FormArray).at(
skillIndex
);
return {
skill: skillFormGroup.get("skill").value,
exp: skillFormGroup.get("exp").value
};
}
employeeFirstName(empIndex: number): string {
return this.employees()
.at(empIndex)
.get("firstName").value;
}
employeeLastName(empIndex: number): string {
return this.employees()
.at(empIndex)
.get("lastName").value;
}
getEmployeeSkill(employeeIdx: number, skillIdx: number) {
const employee = this.empForm.value.employees[employeeIdx];
if (employee === undefined) return null;
return employee.skills.length === 0
? null
: employee.skills.map(skill => skill.skill)[skillIdx];
}
getEmployeeExp(employeeIdx: number, skillIdx: number) {
const employee = this.getEmployeeFormGroup(employeeIdx);
return employee.value.skills.map(skill => skill.skill);
}
getEmployeeSkills(index: number): string[] {
const employee = this.getEmployeeFormGroup(index);
return employee.value.skills.map(skill => skill.skill);
}
private getEmployeeFormGroup(index: number): FormGroup {
return this.employees().at(index) as FormGroup;
}
public onSelect(val){
console.log(val)
let index = parseInt(val) + 1;
console.log(index)
this.enableEndTime = true;
this.tempEndTimeArray = this.endTimeArray.slice(index);
}
}
export class country {
id: string;
name: string;
constructor(id: string, name: string) {
this.id = id;
this.name = name;
}
}
// onCheckChange(event){
// const formArray: FormArray = this.empForm.get('myChoices') as FormArray
// if(event.target.checked){
// // Add a new control in the arrayForm
// formArray.push(new FormControl(event.target.value));
// }else{
// let i: number = 0;
// formArray.controls.forEach((ctrl: FormControl) => {
// if(ctrl.value == event.target.value) {
// // Remove the unselected element from the arrayForm
// formArray.removeAt(i);
// return;
// }
// i++;
// });
// }
// }
// get selectedOptions() { // right now: ['1','3']
// return this.days
// .filter(opt => opt.checked)
// .map(opt => opt.value)
// }