ฉันรู้คำตอบแล้ว แต่ฉันต้องการคำตอบสั้น ๆ เล็กน้อยว่าจะปรับปรุงค่าของแบบฟอร์มอย่างไรเพื่อที่ผู้มาใหม่รายอื่นจะได้รับแนวคิดที่ชัดเจน
โครงสร้างแบบฟอร์มของคุณสมบูรณ์แบบมากที่จะใช้เป็นตัวอย่าง ดังนั้นตลอดคำตอบของฉันฉันจะแสดงว่าเป็นแบบฟอร์ม
this.form = this.fb.group({
'name': ['', Validators.required],
'dept': ['', Validators.required],
'description': ['', Validators.required]
});
ดังนั้นรูปแบบของเราเป็นFormGroupชนิดของวัตถุที่มีสามFormControl
มีสองวิธีในการอัพเดตค่ารุ่น:
ใช้เมธอด setValue () เพื่อตั้งค่าใหม่สำหรับการควบคุมส่วนบุคคล เมธอด setValue () ปฏิบัติตามโครงสร้างของกลุ่มฟอร์มอย่างเคร่งครัดและแทนที่ค่าทั้งหมดสำหรับการควบคุม
ใช้เมธอด patchValue () เพื่อแทนที่คุณสมบัติใด ๆ ที่กำหนดไว้ในวัตถุที่เปลี่ยนแปลงในรูปแบบของแบบฟอร์ม
การตรวจสอบอย่างเข้มงวดของเมธอด setValue () จะช่วยตรวจจับข้อผิดพลาดในการซ้อนในรูปแบบที่ซับซ้อนขณะที่ patchValue () ล้มเหลวอย่างเงียบ ๆ ในข้อผิดพลาดเหล่านั้น
จากเอกสารอย่างเป็นทางการของ Angular ที่นี่
ดังนั้นเมื่ออัปเดตค่าสำหรับอินสแตนซ์กลุ่มฟอร์มที่มีการควบคุมหลายอย่าง แต่คุณอาจต้องการอัปเดตบางส่วนของโมเดล patchValue () เป็นสิ่งที่คุณกำลังมองหา
ลองดูตัวอย่าง เมื่อคุณใช้patchValue ()
this.form.patchValue({
dept: 1
});
//here we are just updating only dept field and it will work.
แต่เมื่อคุณใช้setValue ()คุณจะต้องอัปเดตโมเดลเต็มเนื่องจากจะยึดตามโครงสร้างของกลุ่มฟอร์มอย่างเคร่งครัด ดังนั้นถ้าเราเขียน
this.form.setValue({
dept: 1
});
// it will throw error.
เราจะต้องผ่านคุณสมบัติทั้งหมดของรูปแบบกลุ่มแบบฟอร์ม แบบนี้
this.form.setValue({
name: 'Mr. Bean'
dept: 1,
description: 'spome description'
});
แต่ฉันไม่ได้ใช้สไตล์นี้บ่อยๆ ฉันชอบใช้วิธีการต่อไปนี้ซึ่งช่วยให้โค้ดของฉันสะอาดขึ้นและสามารถเข้าใจได้ง่ายขึ้น
สิ่งที่ฉันทำคือฉันประกาศการควบคุมทั้งหมดเป็นตัวแปรแยกและใช้ setValue () เพื่ออัปเดตการควบคุมเฉพาะนั้น
สำหรับแบบฟอร์มด้านบนฉันจะทำอะไรแบบนี้
get companyIdentifier(): FormControl {
return this.form.get('name') as FormControl;
}
get dept(): FormControl {
return this.form.get('dept') as FormControl;
}
get description(): FormControl {
return this.form.get('description') as FormControl;
}
เมื่อคุณต้องการอัปเดตตัวควบคุมฟอร์มให้ใช้คุณสมบัตินั้นเพื่ออัปเดต ในตัวอย่างผู้ถามพยายามอัปเดตการควบคุมฟอร์มฝ่ายเมื่อผู้ใช้เลือกรายการจากรายการแบบหล่นลง
deptSelected(selected: { id: string; text: string }) {
console.log(selected) // Shows proper selection!
// instead of using this.form.controls['dept'].setValue(selected.id), I prefer the following.
this.dept.setValue(selected.id); // this.dept is the property that returns the 'dept' FormControl of the form.
}
ฉันขอแนะนำให้ดูAPI ของ FormGroupเพื่อรับทราบคุณสมบัติและวิธีการทั้งหมดของ FormGroup
เพิ่มเติม : รู้เกี่ยวกับทะเยอทะยานดูที่นี่