การควบคุมที่ปิดใช้งาน Angular 2 จะไม่รวมอยู่ใน form.value


114

ฉันสังเกตเห็นว่าถ้าฉันปิดใช้งานตัวควบคุมในรูปแบบปฏิกิริยา Angular 2 ตัวควบคุมจะไม่รวมอยู่ใน form.value ตัวอย่างเช่นหากฉันกำหนดแบบฟอร์มของฉันดังนี้:

this.notelinkingForm = new FormGroup({
    Enabled: new FormControl(settings.Enabled, Validators.required),
    LinkToPreceeding: new FormControl({value: settings.LinkToPreceeding, disabled: !settings.Enabled}, Validators.required),
    LinkingTolerance: new FormControl({value: settings.LinkingTolerance, disabled: !settings.Enabled}, Validators.required)
});

และตรวจสอบ this.notelinkingForm.value หากเปิดใช้งานการควบคุมทั้งหมดเอาต์พุตจะเป็น:

{"Enabled":true, "LinkToPreceeding": true, LinkingTolerance:"100"} 

อย่างไรก็ตามเมื่อปิดใช้งานการควบคุมบางส่วนจะเป็น:

{"Enabled":true} 

สังเกตว่ามีการยกเว้นการควบคุมที่ปิดใช้งานอย่างไร

จุดประสงค์ของฉันคือเมื่อแบบฟอร์มเปลี่ยนแปลงฉันต้องการให้สามารถส่ง form.value พร้อมคุณสมบัติทั้งหมดในนั้นออกไปยัง API ที่เหลือของฉัน สิ่งนี้จะเป็นไปไม่ได้อย่างชัดเจนหากไม่มีรายการที่ปิดใช้งาน

ฉันพลาดอะไรบางอย่างที่นี่หรือนี่คือพฤติกรรมที่คาดไว้? มีวิธีบอกให้ Angular รวมรายการที่ปิดใช้งานใน form.value หรือไม่

ยินดีต้อนรับความคิดของคุณ

คำตอบ:


252

คุณสามารถใช้ได้:

this.notelinkingForm.getRawValue()

จากเอกสาร :

หากคุณต้องการรวมค่าทั้งหมดโดยไม่คำนึงถึงสถานะปิดใช้งานให้ใช้วิธีนี้ มิฉะนั้นvalueคุณสมบัติเป็นวิธีที่ดีที่สุดในการรับมูลค่าของกลุ่ม


43
สงสัยว่าทำไมทีม Angular ถึงทำแบบนี้
inorganik

@inorganik พวกเขาทำเพราะสามารถเปิดใช้งานการควบคุมที่ปิดใช้งานและแก้ไขค่าได้ ในกรณีนี้ getRawValue () จะส่งคืนอ็อบเจ็กต์ด้วยค่าที่ถูกดัดแปลง
เดนมาร์ก

1
นี่เป็นสิ่งที่ดีจริงๆ ตัวอย่างเช่นฉันรู้ว่าค่าของการควบคุมที่ปิดใช้งานของฉันจะไม่เปลี่ยนแปลงดังนั้นฉันจึงไม่ต้องการรวมไว้ในบันทึก API เพราะฉันกำหนดค่าการควบคุมเหล่านั้นจากฐานข้อมูลตั้งแต่แรก แต่ในบางกรณีฉันต้องการรวมตัวควบคุมเหล่านั้นที่มีการกำหนดค่าจากส่วนหน้าและไม่ได้เก็บไว้ในฐานข้อมูลและฟังก์ชันนี้ครอบคลุม เป็นเรื่องดีเสมอที่จะมีทั้งสองตัวเลือก
ChiragMS

นั่นคือความจริง @ChiragMS ผมชอบมุมมองว่าตราบใดที่ฉันมีทางเลือกระหว่างและreadonly disabledแต่นี่ไม่ใช่กรณีเช่นช่องทำเครื่องหมายและปุ่มตัวเลือกตามที่ฉันอธิบายไว้ในคำตอบด้านล่าง ในกรณีเหล่านั้นฉันไม่ชอบที่ต้องรับข้อมูลแตกต่างกันและเขียนโค้ดบางอย่างสำหรับกรณีนั้นโดยเฉพาะ
Sandro


7

ขอบคุณ@Sasxaสำหรับสิ่งที่ฉันต้องการ 80%

สำหรับผู้ที่กำลังมองหาวิธีแก้ปัญหาเดียวกัน แต่สำหรับรูปแบบที่ซ้อนกันฉันสามารถแก้ไขได้โดยการเปลี่ยนตามปกติ

this.notelinkingForm.get('nestedForm').value

ถึง

this.notelinkingForm.getRawValue().nestedForm

0

หากคุณใช้readonlyแทนdisabledก็ยังไม่สามารถแก้ไขได้ในขณะที่ข้อมูลจะรวมอยู่ในแบบฟอร์ม แต่นั่นเป็นไปไม่ได้ในทุกกรณี เช่นปุ่มตัวเลือกและช่องทำเครื่องหมายไม่พร้อมใช้งาน ดูMDN เอกสารเว็บ ในกรณีดังกล่าวคุณต้องสมัครโซลูชันอื่น ๆ ที่ให้ไว้ที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.