ใน Angular มีแบบฟอร์มสองประเภท ได้แก่模板驱动
และ模型驱动
[บทช่วยสอนที่เกี่ยวข้องที่แนะนำ: "บทช่วยสอนเชิงมุม"]
1.1 ภาพรวม ตรรกะ
控制逻辑
ของแบบฟอร์มถูกเขียนใน组件模板
ซึ่งเหมาะสำหรับประเภทแบบฟอร์ม简单
1.2 เริ่มต้นใช้งานอย่างรวดเร็ว
1) แนะนำโมดูลที่ต้องพึ่งพา
การนำเข้า FormsModule { FormsModule } จาก "@เชิงมุม/แบบฟอร์ม" @NgModule({ การนำเข้า: [FormsModule], - ส่งออกคลาส AppModule {}
2) แปลงแบบฟอร์ม DOM เป็น ngForm
<form #f="ngForm" (submit)="onSubmit(f)"></form>
3) ประกาศฟิลด์แบบฟอร์มเป็น ngModel
<form #f= " ngForm" (ส่ง)="onSubmit(f)"> <ประเภทอินพุต = "ข้อความ" ชื่อ = "ชื่อผู้ใช้" ngModel /> <ปุ่ม>ส่ง</ปุ่ม> </form>
4) รับค่าฟิลด์แบบฟอร์ม
import { NgForm } จาก "@เชิงมุม/ฟอร์ม" ส่งออกคลาส AppComponent { onSubmit (แบบฟอร์ม: NgForm) { console.log(form.value) // {ชื่อผู้ใช้: ''} - }
5) การจัดกลุ่มแบบฟอร์ม
<form #f="ngForm" (submit)="onSubmit(f)"> <div ngModelGroup="ผู้ใช้"> <ประเภทอินพุต = "ข้อความ" ชื่อ = "ชื่อผู้ใช้" ngModel /> </div> <div ngModelGroup="ติดต่อ"> <ประเภทอินพุต = "ข้อความ" ชื่อ = "โทรศัพท์" ngModel /> </div> <ปุ่ม>ส่ง</ปุ่ม> </form>
นำเข้า { NgForm } จาก "@เชิงมุม/แบบฟอร์ม" ส่งออกคลาส AppComponent { onSubmit (แบบฟอร์ม: NgForm) { console.log(form.value) // {ติดต่อ: {โทรศัพท์: ''} ผู้ใช้:{ชื่อผู้ใช้: ''}} - }
1.3
<form #f="ngForm" (submit)="onSubmit(f)"> <input type="text" name="username" ngModel required pattern="d" /> <ปุ่ม>ส่ง</ปุ่ม> </form>
ส่งออกคลาส AppComponent { onSubmit (แบบฟอร์ม: NgForm) { // ตรวจสอบว่าแบบฟอร์มทั้งหมดได้รับการยืนยันผ่าน console.log(form.valid) หรือไม่ - }
<!-- ปิดการใช้งานการส่งแบบฟอร์มเมื่อทั้งแบบฟอร์มไม่ผ่านการตรวจสอบ --> <button type="submit" [disabled]="f.invalid">ส่ง</button>
แสดงข้อความแสดงข้อผิดพลาดเมื่อรายการแบบฟอร์มล้มเหลวในเทมเพลตส่วนประกอบ
<form #f="ngForm" (ส่ง)="onSubmit(f)"> <input #username="ngModel" /> <div *ngIf="username.touched && !username.valid && ชื่อผู้ใช้.errors"> <div *ngIf="username.errors.required">กรุณากรอกชื่อผู้ใช้</div> <div *ngIf="username.errors.pattern">ไม่สอดคล้องกับกฎปกติ</div> </div> </form>
ระบุสไตล์เมื่อรายการแบบฟอร์มไม่ผ่านการตรวจสอบ
input.ng-touched.ng-ไม่ถูกต้อง { เส้นขอบ: สีแดงทึบ 2px; }
2.1 ภาพรวม
控制逻辑
ของแบบฟอร์มเขียนไว้ใน组件类
ซึ่งสามารถควบคุมตรรกะการตรวจสอบได้มากกว่า และเหมาะสำหรับประเภทแบบฟอร์ม复杂
ในแบบฟอร์มที่เป็นแบบโมเดล ฟิลด์แบบฟอร์มจะต้องเป็นอินสแตนซ์ของคลาส FormControl
วัตถุอินสแตนซ์สามารถ验证表单字段
ไม่ว่าค่าจะได้รับการแก้ไขหรือไม่ เป็นต้น
ชุดของฟิลด์แบบฟอร์มประกอบด้วยแบบฟอร์มทั้งหมด และแบบฟอร์มทั้งหมดต้องเป็นอินสแตนซ์ของคลาส FormGroup
ซึ่งสามารถตรวจสอบความถูกต้อง整体
ของแบบฟอร์มได้
FormControl: รายการแบบฟอร์มในกลุ่มแบบฟอร์ม
FormGroup: กลุ่มแบบฟอร์ม อย่างน้อยหนึ่ง
รายการใน FormArray ล้มเหลวและล้มเหลวทั้งหมด
2.2 เริ่มต้นอย่างรวดเร็ว
1) แนะนำ ReactiveFormsModule
นำเข้า { ReactiveFormsModule } จาก "@เชิงมุม/แบบฟอร์ม" @NgModule({ การนำเข้า: [ReactiveFormsModule] - ส่งออกคลาส AppModule {}
2) สร้างวัตถุควบคุมฟอร์ม FormGroup ในคลาสส่วนประกอบ
import { FormControl, FormGroup } จาก "@เชิงมุม/แบบฟอร์ม" ส่งออกคลาส AppComponent { แบบฟอร์มการติดต่อ: FormGroup = FormGroup ใหม่ ({ ชื่อ: FormControl ใหม่ () โทรศัพท์: FormControl ใหม่ () - }
3). แบบฟอร์มในเทมเพลตส่วนประกอบที่เกี่ยวข้อง
<form [formGroup]="contactForm" (submit)="onSubmit()"> <ประเภทอินพุต = "ข้อความ" formControlName = "ชื่อ" /> <ประเภทอินพุต = "ข้อความ" formControlName = "โทรศัพท์" /> <ปุ่ม>ส่ง</ปุ่ม> </form>
4) รับ
คลาสส่งออกค่าฟอร์ม AppComponent { onSubmit() { console.log (this.contactForm.value) - }
5) ตั้งค่าแบบฟอร์มเริ่มต้น
contactForm: FormGroup = new FormGroup({ ชื่อ: ใหม่ FormControl("ค่าเริ่มต้น"), โทรศัพท์: FormControl ใหม่ (15888888888) })
6) การจัดกลุ่มแบบฟอร์ม
contactForm: FormGroup = new FormGroup({ ชื่อเต็ม: FormGroup ใหม่ ({ ชื่อ: ใหม่ FormControl() นามสกุล: FormControl ใหม่ () - โทรศัพท์: FormControl ใหม่ () })
<แบบฟอร์ม [formGroup]="contactForm" (ส่ง)="onSubmit()"> <div formGroupName="ชื่อเต็ม"> <ประเภทอินพุต = "ข้อความ" formControlName = "firstName" /> <ประเภทอินพุต = "ข้อความ" formControlName = "นามสกุล" /> </div> <ประเภทอินพุต = "ข้อความ" formControlName = "โทรศัพท์" /> <ปุ่ม>ส่ง</ปุ่ม> </form>
onSubmit() { console.log (this.contactForm.value.name.username) console.log(this.contactForm.get(["ชื่อ", "ชื่อผู้ใช้"])?.value) }
2.3
ข้อกำหนดของ FormArray: กลุ่มข้อมูลการติดต่อจะแสดงบนเพจตามค่าเริ่มต้น และสามารถเพิ่มกลุ่มข้อมูลการติดต่อเพิ่มเติมได้โดยการคลิกที่ปุ่ม
นำเข้า { ส่วนประกอบ, OnInit } จาก "@เชิงมุม/แกน" นำเข้า { FormArray, FormControl, FormGroup } จาก "@เชิงมุม/แบบฟอร์ม" @ส่วนประกอบ({ ตัวเลือก: "app-root", templateUrl: "./app.component.html", สไตล์: [] - คลาสส่งออก AppComponent ใช้ OnInit { // แบบฟอร์มการติดต่อแบบฟอร์ม: FormGroup = new FormGroup({ ผู้ติดต่อ: FormArray ใหม่ ([]) - รับผู้ติดต่อ () { ส่งคืน this.contactForm.get("contacts") เป็น FormArray - //เพิ่มข้อมูลการติดต่อ addContact() { //ข้อมูลการติดต่อ const myContact: FormGroup = new FormGroup({ ชื่อ: FormControl ใหม่ () ที่อยู่: FormControl ใหม่ () โทรศัพท์: FormControl ใหม่ () - //เพิ่มข้อมูลการติดต่อลงในอาร์เรย์ข้อมูลการติดต่อ this.contacts.push(myContact) - // ลบข้อมูลผู้ติดต่อ ลบผู้ติดต่อ (i: หมายเลข) { this.contacts.removeAt(i) - ngOnInit() { //เพิ่มข้อมูลการติดต่อเริ่มต้น this.addContact() - onSubmit() { console.log (this.contactForm.value) - }
<แบบฟอร์ม [formGroup]="contactForm" (ส่ง)="onSubmit()"> <div formArrayName="ผู้ติดต่อ"> <div *ngFor="ให้ติดต่อของ contacts.controls; ให้ i = ดัชนี" [formGroupName]="ฉัน" - <ประเภทอินพุต = "ข้อความ" formControlName = "ชื่อ" /> <ประเภทอินพุต = "ข้อความ" formControlName = "ที่อยู่" /> <ประเภทอินพุต = "ข้อความ" formControlName = "โทรศัพท์" /> <button (click)="removeContact(i)">ลบข้อมูลการติดต่อ</button> </div> </div> <button (click)="addContact()">เพิ่มข้อมูลการติดต่อ</button> <ปุ่ม>ส่ง</ปุ่ม> </form>
2.4 เครื่องมือตรวจสอบแบบฟอร์มในตัว
1) ใช้กฎการตรวจสอบที่ได้รับจากเครื่องมือตรวจสอบความถูกต้องในตัวเพื่อตรวจสอบความถูกต้องของฟิลด์แบบฟอร์ม
นำเข้า { FormControl, FormGroup, Validators } จาก "@เชิงมุม/แบบฟอร์ม" แบบฟอร์มการติดต่อ: FormGroup = FormGroup ใหม่ ({ ชื่อ: FormControl ใหม่ ("ค่าเริ่มต้น", [ Validators.จำเป็น, Validators.minLength(2) - })
2). รับว่าแบบฟอร์มทั้งหมดผ่านการตรวจสอบ
onSubmit() { console.log (this.contactForm.valid) }
<!-- ปิดการใช้งานปุ่มแบบฟอร์มเมื่อทั้งแบบฟอร์มไม่ผ่านการตรวจสอบ --> <button [disabled]="contactForm.invalid">ส่ง</button>
3) แสดงข้อความแสดงข้อผิดพลาดเมื่อมีการผ่านการตรวจสอบในเทมเพลตส่วนประกอบ
รับชื่อ () { ส่งคืน this.contactForm.get("ชื่อ")! }
<แบบฟอร์ม [formGroup]="contactForm" (ส่ง)="onSubmit()"> <ประเภทอินพุต = "ข้อความ" formControlName = "ชื่อ" /> <div *ngIf="name.touched && name.invalid && name.errors"> <div *ngIf="name.errors.required">กรุณากรอกชื่อของคุณ</div> <div *ngIf="name.errors.maxlength"> ความยาวชื่อต้องไม่มากกว่า {{ name.errors.maxlength.requiredLength }} </div> </div> </form>
2.5 ตัวตรวจสอบรูปแบบซิงโครนัสแบบกำหนดเอง
ประเภทของตัวตรวจสอบแบบกำหนดเองคือคลาส TypeScript
มี
วิธีการตรวจสอบเฉพาะ
อันที่จริงมันเป็นประเภทของวัตถุอินสแตนซ์ของคลาส FormControl
หากการตรวจสอบสำเร็จ null จะถูกส่งกลับ
หากการตรวจสอบล้มเหลว วัตถุจะถูกส่งกลับ คุณลักษณะในวัตถุคือรหัสการตรวจสอบ และค่าคือ จริง ซึ่งบ่งชี้ว่าการตรวจสอบล้มเหลว
ค่าที่ส่งคืนของวิธีการตรวจสอบคือ ValidationErrors | null
import { AbstractControl, ValidationErrors } จาก "@เชิงมุม/แบบฟอร์ม" ส่งออกคลาส NameValidators { // ค่าฟิลด์ไม่สามารถมีช่องว่าง static cannotContainSpace(control: AbstractControl): ValidationErrors | null { // การตรวจสอบล้มเหลวหาก (/s/.test(control.value)) ส่งคืน { cannotContainSpace: true } //การตรวจสอบผ่าน return null - }
นำเข้า { NameValidators } จาก "./Name.validators" แบบฟอร์มการติดต่อ: FormGroup = FormGroup ใหม่ ({ ชื่อ: FormControl ใหม่ ("", [ Validators.จำเป็น, NameValidators.cannotContainSpace - })
<div *ngIf="name.touched && name.invalid && name.errors"> <div *ngIf="name.errors.cannotContainSpace">ชื่อไม่สามารถมีช่องว่างได้</div> </div>
2.6 ตัวตรวจสอบรูปแบบอะซิงโครนัสแบบกำหนดเอง
นำเข้า { AbstractControl, ValidationErrors } จาก "@เชิงมุม/แบบฟอร์ม" นำเข้า { สังเกตได้ } จาก "rxjs" ส่งออกคลาส NameValidators { shouldBeUnique แบบคงที่ (การควบคุม: AbstractControl): สัญญา <ValidationErrors | . คืนสัญญาใหม่ (แก้ไข => { ถ้า (control.value == "ผู้ดูแลระบบ") { แก้ไข ({ shouldBeUnique: true }) } อื่น { แก้ไข(null) - - - }
แบบฟอร์มการติดต่อ: FormGroup = FormGroup ใหม่ ({ ชื่อ: FormControl ใหม่ ( - - ผู้ตรวจสอบความถูกต้อง.จำเป็น - NameValidators.shouldBeUnique - })
<div *ngIf="name.touched && name.invalid && name.errors"> <div *ngIf="name.errors.shouldBeUnique">ชื่อผู้ใช้ซ้ำ</div> </div> <div *ngIf="name.pending">การตรวจสอบว่าชื่อซ้ำกันหรือไม่</div>
2.7
快捷
FormBuilder เพื่อสร้างแบบฟอร์ม
this.fb.control
: รายการฟอร์ม
this.fb.group
: กลุ่มฟอร์ม ฟอร์มอย่างน้อยหนึ่ง FormGroup
this.fb.array
: ใช้สำหรับฟอร์มที่ซับซ้อน คุณสามารถเพิ่มรายการฟอร์มหรือกลุ่มฟอร์มแบบไดนามิก ในระหว่างการตรวจสอบความถูกต้องของฟอร์ม ที่นั่น เป็น FormArray รายการล้มเหลวและล้มเหลวทั้งหมด
นำเข้า { FormBuilder, FormGroup, Validators } จาก "@เชิงมุม/แบบฟอร์ม" ส่งออกคลาส AppComponent { แบบฟอร์มการติดต่อ: FormGroup ตัวสร้าง (fb ส่วนตัว: FormBuilder) { this.contactForm = this.fb.group({ ชื่อเต็ม: this.fb.group({ ชื่อ: ["", [Validators.required]], นามสกุล: [""] - โทรศัพท์: [] - - }
2.8 การตรวจสอบการเปลี่ยนแปลงค่าแบบฟอร์ม
ในการทำงานจริง เรามักจะจำเป็นต้องดำเนินการประมวลผลที่สอดคล้องกันตามการเปลี่ยนแปลงในค่าแบบฟอร์ม โดยทั่วไป เราสามารถใช้ ngModalChange
หรือแบบฟอร์มเพื่อให้ได้
2.8.1 ngModalChange
<div> <input type="text" [(ngModal)]="name" (ngModalChange)="nameChange()" /> </div>
นำเข้า { FormControl, FormGroup } จาก "@เชิงมุม/แบบฟอร์ม" ส่งออกคลาส AppComponent { ชื่อสาธารณะ = 'a'; ชื่อสาธารณะเปลี่ยน () { - }
Angular ไม่แนะนำให้ใช้ ngModalChange อย่างเป็นทางการ
2.8.2 การควบคุมแบบฟอร์ม
<div [formGroup]="contactForm"> <ประเภทอินพุต = "ข้อความ" formControlName = "ชื่อ" /> </div>
นำเข้า { FormControl, FormGroup } จาก "@เชิงมุม/แบบฟอร์ม" ส่งออกคลาส AppComponent { แบบฟอร์มการติดต่อ: FormGroup = FormGroup ใหม่ ({ ชื่อ: FormControl ใหม่ () - ngOnInt() { this.contactForm.get("ชื่อ").valueChanges.subscribe(ข้อมูล => { console.log(ข้อมูล); - - }
2.9 แบบฝึกหัด
ที่ 1) รับค่าที่เลือกในกลุ่มของช่องทำเครื่องหมาย
<form [formGroup]="form" (submit)="onSubmit()"> <label *ngFor="ให้รายการข้อมูล"> <input type="ช่องทำเครื่องหมาย" [value]="item.value" (change)="onChange($event)" /> {{ รายการชื่อ }} </ฉลาก> <ปุ่ม>ส่ง</ปุ่ม> </form>
นำเข้า { ส่วนประกอบ } จาก "@เชิงมุม/แกน" นำเข้า { FormArray, FormBuilder, FormGroup } จาก "@เชิงมุม/แบบฟอร์ม" ข้อมูลอินเทอร์เฟซ { ชื่อ: สตริง ค่า: สตริง - @ส่วนประกอบ({ ตัวเลือก: "ช่องทำเครื่องหมายแอป", templateUrl: "./checkbox.component.html", สไตล์: [] - ส่งออกคลาส CheckboxComponent { ข้อมูล: อาร์เรย์<ข้อมูล> = [ { ชื่อ: "ลูกแพร์" ค่า: "ลูกแพร์" }, { ชื่อ: "พลัม" ค่า: "พลัม" } { ชื่อ: "กีวี" ค่า: "กีวี" } { ชื่อ: "แอปเปิ้ล" ค่า: "แอปเปิ้ล" } { ชื่อ: "มะนาว" ค่า: "มะนาว" } - แบบฟอร์ม: FormGroup ตัวสร้าง (fb ส่วนตัว: FormBuilder) { this.form = this.fb.group({ checkArray: this.fb.array([]) - - onChange (เหตุการณ์: เหตุการณ์) { const target = event.target เป็น HTMLInputElement ตรวจสอบ const = target.checked ค่า const = target.value const checkArray = this.form.get("checkArray") เป็น FormArray ถ้า (ตรวจสอบ) { checkArray.push(this.fb.control(ค่า)) } อื่น { ดัชนี const = checkArray.controls.findIndex( ควบคุม => control.value === ค่า - checkArray.removeAt (ดัชนี) - - onSubmit() { console.log(this.form.value) - }
2) รับค่าที่เลือกในคลาส
ส่งออกปุ่มตัวเลือก AppComponent { แบบฟอร์ม: FormGroup ตัวสร้าง (fb สาธารณะ: FormBuilder) { this.form = this.fb.group({ เพศ: "" }) - onSubmit() { console.log(this.form.value) - }
<แบบฟอร์ม [formGroup]="แบบฟอร์ม" (ส่ง)="onSubmit()"> <input type="radio" value="male" formControlName="gender" /> ชาย <input type="radio" value="Female" formControlName="gender" /> เพศหญิง <button type="submit">ส่ง</button> </form>
2.10 Other
patchValue: ตั้งค่าของการควบคุมแบบฟอร์ม (คุณสามารถตั้งค่าทั้งหมดหรือคุณสามารถตั้งค่าอย่างใดอย่างหนึ่งก็ได้ ส่วนอื่นๆ จะไม่ได้รับผลกระทบ)
setValue: ตั้งค่าของการควบคุมแบบฟอร์ม (ตั้งค่าทั้งหมด ไม่สามารถแยกออกได้) อันใดอันหนึ่ง)
การเปลี่ยนแปลงค่า: เมื่อแบบฟอร์ม เหตุการณ์การรีเซ็ตจะถูกทริกเกอร์เมื่อค่าของการควบคุมเปลี่ยนแปลง
: เนื้อหาของแบบฟอร์มว่างเปล่า