วิธีเริ่มต้นใช้งาน VUE3.0 อย่างรวดเร็ว: การเข้าสู่การเรียนรู้
Angular มีสองวิธีที่แตกต่างกันในการจัดการอินพุตของผู้ใช้ผ่านแบบฟอร์ม:响应式表单
และ模板驱动表单
[คำแนะนำบทช่วยสอนที่เกี่ยวข้อง: "บทช่วยสอนเชิงมุม"]
ที่นี่แนะนำเฉพาะแบบฟอร์มตอบสนองเท่านั้น สำหรับแบบฟอร์มที่ขับเคลื่อนด้วยเทมเพลต โปรดดูที่เว็บไซต์อย่างเป็นทางการ:
https://angular.cn/guide/forms-overview#setup-in-template-driven-forms
หากต้องการใช้การควบคุมแบบฟอร์มตอบสนอง คุณจะต้องนำเข้า ReactiveFormsModule
จากแพ็คเกจ @angular/forms
และเพิ่มลงในอาร์เรย์ imports
ของ NgModule
ของคุณ ดังนี้: app.module.ts
/***** app.module.ts *****/ นำเข้า { ReactiveFormsModule } จาก '@ เชิงมุม/แบบฟอร์ม'; @NgModule({ นำเข้า: [ // สินค้านำเข้าอื่นๆ ... โมดูลแบบฟอร์มปฏิกิริยา - - ส่งออกคลาส AppModule { }
มีสามขั้นตอนในการใช้การควบคุมแบบฟอร์ม
ลงทะเบียนโมดูลแบบฟอร์มเชิงโต้ตอบในแอปของคุณ โมดูลนี้ประกาศคำสั่งบางอย่างที่คุณต้องการใช้ในรูปแบบเชิงโต้ตอบ
สร้างอินสแตนซ์ FormControl
ใหม่และบันทึกไว้ในส่วนประกอบ
ลงทะเบียน FormControl
นี้ในเทมเพลต
หากต้องการลงทะเบียนการควบคุมแบบฟอร์ม ให้นำเข้าคลาส FormControl
และสร้างอินสแตนซ์ใหม่ของ FormControl
โดยบันทึกเป็นคุณสมบัติของคลาส ดังต่อไปนี้: test.component.ts
/***** test.component.ts *****/ นำเข้า { ส่วนประกอบ } จาก '@ เชิงมุม/หลัก'; นำเข้า { FormControl } จาก '@ เชิงมุม/แบบฟอร์ม'; @ส่วนประกอบ({ ตัวเลือก: 'ชื่อแอป-ตัวแก้ไข', templateUrl: './name-editor.component.html', styleUrls: ['./name-editor.component.css'] - ส่งออกคลาส TestComponent { // คุณสามารถตั้งค่าเริ่มต้นในตัวสร้างของ FormControl ได้ ในตัวอย่างนี้คือชื่อสตริงว่าง = new FormControl(''); }
จากนั้นลงทะเบียนการควบคุมในเทมเพลตดังต่อไปนี้: test.component.html
<!-- test.component.html --> <ฉลาก> ชื่อ: <input type="text" [formControl]="name"> </ฉลาก> <!-- หากค่าที่ป้อนในอินพุตเปลี่ยนแปลง ค่าที่แสดงที่นี่ก็จะเปลี่ยนไปเช่นกัน --> <p>ชื่อ: {{ name.value }}</p>
สำหรับคุณสมบัติและวิธีการอื่นๆ ของ
FormControl
โปรดดูที่ คู่มืออ้างอิง APIhttps://angular.cn/api/forms/FormControl#formcontrol
เช่นเดียวกับอินสแตนซ์ของ FormControl
ที่ให้คุณควบคุมการควบคุมที่สอดคล้องกับกล่องอินพุตเดียว อินสแตนซ์ของ FormGroup
ก็สามารถติดตามกลุ่มของ อินสแตนซ์ FormControl
(เช่น สถานะแบบฟอร์มของแบบฟอร์ม) เมื่อมีการสร้าง FormGroup
แต่ละตัวควบคุมในนั้นจะถูกติดตามตามชื่อของมัน
ดูตัวอย่างการสาธิตต่อไปนี้: test.component.ts
, test.component.html
import { Component } from '@angular/core'; นำเข้า { FormControl, FormGroup, Validators } จาก '@ เชิงมุม/แบบฟอร์ม' @ส่วนประกอบ({ ตัวเลือก: 'ทดสอบแอป', templateUrl: './test.component.html', styleUrls: ['./test.component.css'] - คลาสส่งออก TestComponent ใช้ OnInit { ตัวสร้าง () {} profileForm = FormGroup ใหม่ ({ ชื่อ: new FormControl('', [Validators.required,Validators.pattern('[a-zA-Z0-9]*')]), นามสกุล: ใหม่ FormControl('', Validators.required), - onSubmit() { // ตรวจสอบค่าของแต่ละฟิลด์ในกลุ่มควบคุม console.log(this.profileForm.value) - }
<!--profileForm FormGroup นี้เชื่อมโยงกับองค์ประกอบของฟอร์มผ่านคำสั่ง FormGroup สร้างเลเยอร์การสื่อสารระหว่างโมเดลและกล่องอินพุตในแบบฟอร์ม --> <!-- คำสั่ง FormGroup ยังรับฟังเหตุการณ์ send ที่ปล่อยออกมาจากองค์ประกอบแบบฟอร์มและปล่อยเหตุการณ์ ngSubmit ซึ่งทำให้คุณสามารถผูกฟังก์ชันการโทรกลับได้ - <แบบฟอร์ม [formGroup]="profileForm" (ngSubmit)="onSubmit()"> <ฉลาก> <!-- คำสั่ง FormControlName ผูกแต่ละกล่องอินพุตเข้ากับตัวควบคุมฟอร์ม FormControl ที่กำหนดไว้ใน FormGroup การควบคุมแบบฟอร์มเหล่านี้จะสื่อสารกับองค์ประกอบที่เกี่ยวข้อง --> ชื่อ: <input type="text" formControlName="firstName"> </ฉลาก> <ฉลาก> นามสกุล: <input type="text" formControlName="lastName"> </ฉลาก> <button type="submit" [disabled]="!profileForm.valid">ส่ง</button> </แบบฟอร์ม> <p>{{ profileForm.value }}</p> <!-- สถานะของกลุ่มควบคุม: INVALID หรือ VALID --> <p>{{ profileForm.status }}</p> <!-- ค่าที่ป้อนโดยกลุ่มควบคุมเป็นค่าที่ถูกต้องหรือไม่: จริงหรือเท็จ--> <p>{{ profileForm.valid }}</p> <!-- ว่าจะปิดการใช้งานหรือไม่: จริงหรือเท็จ--> <p>{{ profileForm.disabled }}</p>
สำหรับคุณสมบัติและวิธีการอื่นๆ ของ
FormGroup
โปรดดูที่ คู่มืออ้างอิง APIhttps://angular.cn/api/forms/FormGroup#formgroup
ในรูปแบบที่ตอบสนอง เมื่อคุณต้องการจัดการกับหลายรูปแบบ การสร้างอินสแตนซ์การควบคุมแบบฟอร์มหลายรายการด้วยตนเองจะเป็นเรื่องที่น่าเบื่อมาก บริการ FormBuilder
มอบวิธีการที่สะดวกสบายในการสร้างการควบคุมแบบฟอร์ม FormBuilder
สร้างและส่งคืนอินสแตนซ์เหล่านี้ในลักษณะเดียวกับเบื้องหลัง ซึ่งใช้งานง่ายกว่า
FormBuilder
เป็นผู้ให้บริการแบบฉีดที่ให้บริการโดย ReactiveFormModule
การพึ่งพานี้สามารถแทรกเข้าไปได้โดยเพียงแค่เพิ่มมันลงในตัวสร้างของส่วนประกอบ
บริการ
FormBuilder
มีสามวิธี:control()
,group()
และarray()
วิธีการเหล่านี้เป็นวิธีการจากโรงงานสำหรับการสร้างFormControl
,FormGroup
และFormArray
ตามลำดับในคลาสส่วนประกอบ
ดูตัวอย่างต่อไปนี้: test.component.ts
นำเข้า { ส่วนประกอบ } จาก '@เชิงมุม/core'; // 1. นำเข้า FormBuilder นำเข้า { FormBuilder, Validators } จาก '@ เชิงมุม/แบบฟอร์ม'; @ส่วนประกอบ({ ตัวเลือก: 'ทดสอบแอป', templateUrl: './test.component.html', styleUrls: ['./test.component.css'] - ส่งออกคลาส TestComponent { // 2. ใส่ตัวสร้างบริการ FormBuilder (fb ส่วนตัว: FormBuilder) { } ngOnInit() { } profileForm = this.fb.group({ ชื่อ: ['', [Validators.required, Validators.pattern('[a-zA-Z0-9]*')]], นามสกุล: ['', Validators.required], - // เทียบเท่ากับ // profileForm = new FormGroup({ // ชื่อ: new FormControl('', [Validators.required,Validators.pattern('[a-zA-Z0-9]*')]), // นามสกุล: new FormControl('', Validators.required), - onSubmit() { console.log (this.profileForm.value) console.log (this.profileForm) - }
จากการเปรียบเทียบ พบว่าการใช้บริการ FormBuilder
สามารถสร้าง FormControl
, FormGroup
และ FormArray
ได้สะดวกยิ่งขึ้น โดยไม่ต้องสร้างอินสแตนซ์ new
ด้วยตนเองทุกครั้ง
สำหรับรายการ API ที่สมบูรณ์ของเครื่องมือ
Validators
โปรดดูที่ คู่มือ APIhttps://angular.cn/api/forms/Validators
ฟังก์ชันเครื่องมือตรวจสอบความถูกต้อง ( Validators
) อาจเป็นฟังก์ชันซิงโครนัสหรือฟังก์ชันอะซิงโครนัสก็ได้
FormControl
Promise
หรือ Observable
ซึ่งต่อมาจะปล่อยชุดของข้อผิดพลาดในการตรวจสอบหรือค่าว่าง สามารถส่งผ่านเป็นพารามิเตอร์ที่สามได้เมื่อสร้างอินสแตนซ์ FormControl
ด้วยเหตุผลด้านประสิทธิภาพ Angular จะไม่เรียกใช้เครื่องมือตรวจสอบแบบอะซิงโครนัสจนกว่าเครื่องมือตรวจสอบแบบซิงโครนัสทั้งหมดจะผ่าน ข้อผิดพลาดในการตรวจสอบความถูกต้องเหล่านี้จะถูกตั้งค่าหลังจากดำเนินการตรวจสอบความถูกต้องแบบอะซิงโครนัสแต่ละตัวแล้ว
https://angular.cn/api/forms/Validators
คลาสเครื่องมือตรวจสอบ { คงที่ขั้นต่ำ (นาที: หมายเลข): ValidatorFn // ค่าต่ำสุดที่อนุญาตให้ป้อน คงที่สูงสุด (สูงสุด: หมายเลข): ValidatorFn // ค่าสูงสุดคงที่ที่จำเป็น (การควบคุม: AbstractControl): ValidationErrors | null // ไม่ว่าจะเป็นที่ต้องการคงที่ requiredTrue (การควบคุม: AbstractControl): ValidationErrors | อีเมลคงที่ (การควบคุม: AbstractControl): ValidationErrors |. null // ไม่ว่าจะเป็นรูปแบบอีเมล static minLength (minLength: number): ValidatorFn // ความยาวขั้นต่ำคงที่ maxLength (maxLength: number): ValidatorFn // รูปแบบคงที่ความยาวสูงสุด (รูปแบบ: string |. RegExp): ValidatorFn // การจับคู่แบบคงที่ nullValidator (การควบคุม: AbstractControl): ValidationErrors | null // ไม่ต้องทำอะไรเลยในการเขียนแบบคงที่ (validators: ValidatorFn []): ValidatorFn | composeAsync แบบคงที่ (ตัวตรวจสอบ: AsyncValidatorFn []): AsyncValidatorFn | null }
การนำเข้า { ตัวตรวจสอบความถูกต้อง } จาก '@ เชิงมุม/แบบฟอร์ม';
เมื่อสร้างอินสแตนซ์ของตัวควบคุม FormControl
- ngOnInit(): เป็นโมฆะ { this.heroForm = FormGroup ใหม่ ({ // สร้างอินสแตนซ์ของชื่อตัวควบคุม FormControl: new FormControl(this.hero.name, [ Validators.required, // การตรวจสอบความถูกต้อง, จำเป็นต้องใช้ Validators.minLength(4), // ความยาวไม่น้อยกว่า 4 forbiddenNameValidator(/bob/i) // เครื่องมือตรวจสอบแบบกำหนดเอง]), alterEgo: FormControl ใหม่ (this.hero.alterEgo) พลัง: FormControl ใหม่ (this.hero.power, Validators.required) - - รับชื่อ () { return this.heroForm.get('name'); } get power() { return this.heroForm.get('power'); }
สำหรับเนื้อหาของเครื่องมือตรวจสอบที่กำหนดเอง โปรดดู คู่มือ API
https://angular.cn/guide/form-validation
บางครั้งมีอยู่แล้วภายใน การตรวจสอบความถูกต้อง โปรเซสเซอร์ไม่สามารถตอบสนองความต้องการได้เป็นอย่างดี ตัวอย่างเช่น เราจำเป็นต้องตรวจสอบแบบฟอร์มและค่าอินพุตสามารถเป็นค่าในอาร์เรย์ที่กำหนดเท่านั้น และค่าในอาร์เรย์นี้จะเปลี่ยนแปลงแบบเรียลไทม์เมื่อโปรแกรมทำงาน เวลา ตัวตรวจสอบในตัวไม่สามารถตอบสนองข้อกำหนดนี้ได้ และจำเป็นต้องสร้างเครื่องมือตรวจสอบแบบกำหนดเอง
เพิ่มเครื่องมือตรวจสอบที่กำหนดเองในรูปแบบตอบสนอง ในส่วนเครื่องมือตรวจสอบความถูกต้องในตัวด้านบน มีฟังก์ชัน forbiddenNameValidator
ดังนี้:
import { Validators } from '@angular/forms'; - ngOnInit(): เป็นโมฆะ { this.heroForm = FormGroup ใหม่ ({ ชื่อ: FormControl ใหม่ (this.hero.name, [ Validators.จำเป็น, Validators.minLength(4), // 1. เพิ่มเครื่องมือตรวจสอบแบบกำหนดเอง forbiddenNameValidator(/bob/i) - - - // 2. ใช้งานเครื่องมือตรวจสอบความถูกต้องที่กำหนดเองซึ่งมีฟังก์ชั่นห้ามไม่ให้อินพุตค่าด้วยฟังก์ชั่นการส่งออกสตริง bob forbiddenNameValidator(nameRe: RegExp): ValidatorFn { กลับ (การควบคุม: AbstractControl): ValidationErrors | null => { const ห้าม = nameRe.test (control.value); // 3. คืนค่า null เมื่อค่าถูกต้อง หรือส่งคืนออบเจ็กต์ข้อผิดพลาดในการตรวจสอบ เมื่อไม่ถูกต้อง return forbidden ? {forbiddenName: {value: control.value}} : null; - }
เครื่องมือตรวจสอบจะส่งคืน
null
หากค่าถูกต้อง หรือ验证错误对象
หากไม่ถูกต้อง ออบเจ็กต์ข้อผิดพลาดในการตรวจสอบความถูกต้องมักจะมีแอตทริบิวต์ที่เรียกว่าคีย์การตรวจสอบความถูกต้อง (forbiddenName
) ค่าของมันคือพจนานุกรมที่กำหนดเองที่คุณสามารถใช้เพื่อแทรกข้อความแสดงข้อผิดพลาด ({name})
เพิ่มเครื่องมือตรวจสอบแบบกำหนดเองในแบบฟอร์มที่ขับเคลื่อนด้วยเทมเพลต หากต้องการเพิ่มคำสั่งให้กับเทมเพลต คำสั่งดังกล่าวจะมีฟังก์ชัน validator
ในเวลาเดียวกัน คำสั่งนี้จำเป็นต้องลงทะเบียนตัวเองเป็นผู้ให้บริการ NG_VALIDATORS
ดังที่แสดงด้านล่าง:
// 1. นำเข้าคลาสที่เกี่ยวข้องนำเข้า { NG_VALIDATORS, Validator, AbstractControl, ValidationErrors } จาก '@เชิงมุม/แบบฟอร์ม'; นำเข้า {Input} จาก '@ เชิงมุม/หลัก' @คำสั่ง({ ตัวเลือก: '[appForbiddenName]', // 2. ลงทะเบียนเป็นผู้ให้บริการของผู้ให้บริการโทเค็น NG_VALIDATORS: [{ระบุ: NG_VALIDATORS, useExisting: ForbiddenValidatorDirective, multi: true}] - คลาสส่งออก ForbiddenValidatorDirective ใช้ Validator { @Input('appForbiddenName') forbiddenName = ''; // 3. ใช้อินเทอร์เฟซตัวตรวจสอบความถูกต้อง นั่นคือ ใช้ฟังก์ชันตรวจสอบความถูกต้อง ตรวจสอบ(การควบคุม: AbstractControl): ValidationErrors | null { // ส่งคืนค่า null เมื่อค่าถูกต้อง หรือส่งคืนวัตถุข้อผิดพลาดในการตรวจสอบความถูกต้อง เมื่อส่งคืนสิ่งนี้ไม่ถูกต้อง forbiddenName ? forbiddenNameValidator(regExp ใหม่ (this.forbiddenName, 'i'))(control) : โมฆะ; - - // 4. ฟังก์ชั่นการส่งออกฟังก์ชั่นการตรวจสอบที่กำหนดเอง forbiddenNameValidator (nameRe: RegExp): ValidatorFn { กลับ (การควบคุม: AbstractControl): ValidationErrors | null => { const ห้าม = nameRe.test (control.value); // 3. คืนค่า null เมื่อค่าถูกต้อง หรือส่งคืนออบเจ็กต์ข้อผิดพลาดในการตรวจสอบ เมื่อไม่ถูกต้อง return forbidden ? {forbiddenName: {value: control.value}} : null; - }
โปรดทราบว่าคำสั่งการตรวจสอบความถูกต้องที่กำหนดเองจะถูกสร้างอินสแตนซ์ด้วย
useExisting
แทนuseClass
หากใช้useClass
แทนuseExisting
อินสแตนซ์คลาสใหม่จะถูกลงทะเบียน แต่จะไม่มีforbiddenName
<input type="text" จำเป็นต้องใช้ appForbiddenName="bob" [(ngModel)]="hero.name">