После отправки формы я хочу зафиксировать только значения полей, которые были изменены.
Использование функции valueChanges в форме фиксирует каждое поле формы, и его нельзя пройти как массив, как я пытался сделать в своем коде ниже.
Я не уверен в каком-либо другом способе сравнения значений формы «до и после» и их сохранения там, где хранятся только измененные поля.
export class JobEditComponent implements OnInit {
jobNumber: any;
jobs: any[];
jobToEdit: Job;
job: any;
brands: Brand[];
jobForm: FormGroup;
bsConfig: Partial<BsDatepickerConfig>;
isFormReady: any;
jobId: number;
existingValues: string[] = [];
changedValues: string[] = [];
constructor(private route: ActivatedRoute,
private jobService: JobService,
private fb: FormBuilder,
private router: Router,
private alertify: AlertifyService) { }
ngOnInit() {
this.route.params.subscribe(params => {
this.jobNumber = +params['id'];
});
this.jobService.getJobToEdit().subscribe((jobs: Job[]) => {
this.jobs = jobs;
}, error => { console.log('error');
}, () => {
this.jobToEdit = this.jobs.find(j => j.id === this.jobNumber);
this.editJobForm();
this.onChanges();
});
this.getBrands();
this.bsConfig = {
containerClass: 'theme-blue'
};
}
onChanges(): void {
this.jobForm.valueChanges.subscribe(val => {
if (this.existingValues != null) {
this.existingValues = val;
}
});
}
editJobForm() {
this.jobForm = this.fb.group({
jobNumber: [this.jobToEdit.jobNumber, Validators.required],
item: [this.jobToEdit.item, Validators.required],
status: [this.jobToEdit.status, Validators.required],
orderedBy: [this.jobToEdit.orderedBy, Validators.required],
orderDate: [this.jobToEdit.orderDate, Validators.required],
quantity: [this.jobToEdit.quantity, Validators.required],
unitPrice: [this.jobToEdit.unitPrice, Validators.required],
lineValue: [this.jobToEdit.lineValue, Validators.required],
dpAp: [this.jobToEdit.dpAp, Validators.required],
eta: [this.jobToEdit.eta, Validators.required],
detailStatus: [this.jobToEdit.detailStatus, Validators.required],
comments: [this.jobToEdit.comments, null]
}, ); this.isFormReady = true;
}
updateJob() {
this.alertify.confirm('Are you sure you want save changes?', () => {
this.jobId = this.jobToEdit.id;
this.jobToEdit = Object.assign({}, this.jobForm.value);
this.jobService.editJob(this.jobToEdit, this.jobId).subscribe(() => {
this.alertify.success('Update successful');
**for (let i = 0; i < this.existingValues.length; i++) {
if (this.jobToEdit[i] !== this.existingValues[i]) {
this.changedValues[i] = this.jobToEdit[i];
}
}**
console.log(this.changedValues);
}, error => {
this.alertify.error(error);
}, () => {
this.router.navigate(['/home']);
});
});
}
}