VUE3.0을 빠르게 시작하는 방법:
Angular는 양식을 통해 사용자 입력을 처리하는 두 가지 방법인响应式表单
과模板驱动表单
제공합니다. [관련 튜토리얼 권장사항: "Angular Tutorial"]
여기서는 반응형 폼만 소개합니다. 템플릿 기반 폼은 공식 홈페이지를 참고하세요:
https://angular.cn/guide/forms-overview#setup-in-template-driven-forms
반응형 양식 컨트롤을 사용하려면 @angular/forms
패키지에서 ReactiveFormsModule
가져와 NgModule
의 imports
배열에 추가해야 합니다. 다음과 같습니다: app.module.ts
/***** app.module.ts *****/ import { ReactiveFormsModule } from '@angular/forms'; @NgModule({ 수입: [ // 기타 수입품 ... ReactiveForms모듈 ], }) 내보내기 클래스 AppModule { }
양식 컨트롤을 사용하는 데는 세 단계가 있습니다.
앱에 반응형 양식 모듈을 등록합니다. 이 모듈은 반응형 형식에서 사용하려는 일부 지시문을 선언합니다.
새 FormControl
인스턴스를 생성하고 구성 요소에 저장합니다.
이 FormControl
템플릿에 등록합니다.
양식 컨트롤을 등록하려면 FormControl
클래스를 가져오고 FormControl
의 새 인스턴스를 만들어 클래스의 속성으로 저장합니다. 다음과 같습니다: test.component.ts
/***** test.comComponent.ts *****/ '@angular/core'에서 { 구성요소 }를 가져옵니다. import { FormControl } from '@angular/forms'; @요소({ 선택기: '앱 이름-편집기', templateUrl: './name-editor.comComponent.html', styleUrls: ['./name-editor.comComponent.css'] }) 내보내기 클래스 TestComponent { // FormControl의 생성자에서 초기 값을 설정할 수 있습니다. 이 예에서는 빈 문자열입니다. name = new FormControl(''); }
그런 다음 다음과 같이 템플릿에 컨트롤을 등록합니다. test.component.html
<!-- test.comComponent.html --> <라벨> 이름: <input type="text" [formControl]="이름"> </label> <!-- 입력에 입력된 값이 변경되면 여기에 표시되는 값도 변경됩니다 --> <p>name: {{ name.value }}</p>
은
FormControl
의 다른 속성 및 메서드에 대해서는 API 참조 매뉴얼 을 참조하세요.https://angular.cn/api/forms/FormControl#formcontrol
FormControl
의 인스턴스를 사용하여 단일 입력 상자에 해당하는 컨트롤을 제어할 수 있는 것처럼 FormGroup
의 인스턴스도 그룹을 추적할 수 있습니다. FormControl
인스턴스(예: 양식의 양식 상태) FormGroup
생성되면 그 안의 각 컨트롤은 해당 이름으로 추적됩니다.
다음 예제 데모를 참조하세요. test.component.ts
, test.component.html
import { Component } from '@angular/core'; '@angular/forms'에서 { FormControl, FormGroup, Validators } 가져오기 @요소({ 선택기: '앱 테스트', templateUrl: './test.comComponent.html', styleUrls: ['./test.comComponent.css'] }) 내보내기 클래스 TestComponent는 OnInit {를 구현합니다. 생성자() {} profileForm = 새 FormGroup({ firstName: new FormControl('', [Validators.required,Validators.pattern('[a-zA-Z0-9]*')]), 성: new FormControl('', Validators.required), }); onSubmit() { // 컨트롤 그룹의 각 필드 값을 확인합니다. console.log(this.profileForm.value) } }
<!-- profileForm 이 FormGroup은 FormGroup 지시문을 통해 양식 요소에 바인딩되어 모델과 양식의 입력 상자 사이에 통신 계층을 생성합니다 --> <!-- FormGroup 지시문은 또한 양식 요소에서 발생하는 submit 이벤트를 수신하고 ngSubmit 이벤트를 발생시켜 콜백 함수를 바인딩할 수 있습니다. --> <form [formGroup]="profileForm" (ngSubmit)="onSubmit()"> <라벨> <!-- FormControlName 지시어는 각 입력 상자를 FormGroup에 정의된 양식 컨트롤 FormControl에 바인딩합니다. 이러한 양식 컨트롤은 해당 요소와 통신합니다 --> 이름: <input type="text" formControlName="firstName"> </label> <라벨> 성: <input type="text" formControlName="lastName"> </label> <button type="submit" [disabled]="!profileForm.valid">제출</button> </form> <p>{{ profileForm.값 }}</p> <!-- 제어 그룹의 상태: INVALID 또는 VALID --> <p>{{ profileForm.status }}</p> <!-- 통제그룹이 입력한 값이 유효한 값인지 여부: true 또는 false--> <p>{{ profileForm.valid }}</p> <!-- 비활성화 여부: true 또는 false--> <p>{{ profileForm.disabled }}</p>
FormGroup
의 다른 속성 및 메서드에 대해서는 API 참조 매뉴얼 을 참조하세요.https://angular.cn/api/forms/FormGroup#formgroup은
. 반응형 양식에서 여러 양식을 처리해야 할 때 여러 양식 컨트롤 인스턴스를 수동으로 만드는 것은 매우 지루합니다. FormBuilder
서비스는 양식 컨트롤을 생성하는 몇 가지 편리한 방법을 제공합니다. FormBuilder
백그라운드에서 동일한 방식으로 이러한 인스턴스를 생성하고 반환하므로 사용이 더 간단합니다.
FormBuilder
ReactiveFormModule
에서 제공하는 주입 가능한 서비스 제공자입니다. 이 종속성은 구성 요소의 생성자에 추가하기만 하면 주입될 수 있습니다.
FormBuilder
서비스에는control()
,group()
및array()
세 가지 메서드가 있습니다. 이러한 메서드는 구성 요소 클래스에서 각각FormControl
,FormGroup
및FormArray
생성하기 위한 팩토리 메서드입니다.
다음 예를 참조하세요. test.component.ts
import { Component } from '@angular/core'; // 1. FormBuilder 가져오기 import { FormBuilder, Validators } from '@angular/forms'; @요소({ 선택기: '앱 테스트', templateUrl: './test.comComponent.html', styleUrls: ['./test.comComponent.css'] }) 내보내기 클래스 TestComponent { // 2. FormBuilder 서비스 생성자 삽입(private fb: FormBuilder) { } ngOnInit() { } profileForm = this.fb.group({ firstName: ['', [Validators.required, Validators.pattern('[a-zA-Z0-9]*')]], 성: ['', Validators.required], }); // 동일 // profileForm = new FormGroup({ // firstName: 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
서비스를 사용하면 매번 new
인스턴스를 수동으로 생성할 필요 없이 FormControl
, FormGroup
및 FormArray
보다 편리하게 생성할 수 있다는 것을 알 수 있습니다.
검사기 클래스
Validators
검사기의 전체 API 목록은 API 매뉴얼https://angular.cn/api/forms/Validators를 참조하세요.
유효성 검사기( Validators
) 함수는 동기 함수 또는 비동기 함수일 수 있습니다.
FormControl
을 인스턴스화할 때 생성자의 두 번째 매개변수로 전달할 수 있습니다.Promise
또는 Observable
반환합니다. 이는 나중에 일련의 유효성 검사 오류 또는 null을 내보냅니다. FormControl
인스턴스화할 때 세 번째 매개변수로 전달할 수 있습니다.성능상의 이유로 Angular는 모든 동기 유효성 검사기가 통과할 때까지 비동기 유효성 검사기를 실행하지 않습니다. 이러한 유효성 검사 오류는 각 비동기 유효성 검사기가 실행된 후에 설정됩니다.
https://angular.cn/api/forms/Validators
클래스 유효성 검사기 { static min(min: number): ValidatorFn // 입력 가능한 최소값 static max(max: number): ValidatorFn // 최대값 static 필수(control: AbstractControl): ValidationErrors null // 필수 여부 static 필수True(컨트롤: AbstractControl): ValidationErrors | static email(control: AbstractControl): ValidationErrors null // 이메일 형식인지 여부 static minLength(minLength: number): ValidatorFn // 최소 길이 static maxLength(maxLength: number): ValidatorFn // 최대 길이 static Pattern(pattern: string | RegExp): ValidatorFn // 정규 일치 static nullValidator(control: AbstractControl): ValidationErrors null // 아무것도 하지 않음 static compose(validators: ValidatorFn[]): ValidatorFn | static composeAsync(validators: AsyncValidatorFn[]): AsyncValidatorFn null | }
FormControl
컨트롤을 인스턴스화할 때
'@angular/forms'에서 import { Validators }를추가하면 됩니다.
... ngOnInit(): 무효 { this.heroForm = 새로운 FormGroup({ // FormControl 컨트롤 이름을 인스턴스화합니다. new FormControl(this.hero.name, [ Validators.required, // 유효성 검사, 필수 Validators.minLength(4), // 길이는 4 이상입니다. allowedNameValidator(/bob/i) // 사용자 정의 유효성 검사기]), alterEgo: 새로운 FormControl(this.hero.alterEgo), 힘: 새로운 FormControl(this.hero.power, Validators.required) }); } get name() { 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.minLength(4), // 1. 사용자 정의 유효성 검사기 추가 allowedNameValidator(/bob/i) ]) }); } // 2. bob 문자열 내보내기 함수를 사용하여 값 입력을 금지하는 기능을 가진 사용자 정의 유효성 검사기를 구현합니다. allowedNameValidator(nameRe: RegExp): ValidatorFn { 반환(컨트롤: AbstractControl): ValidationErrors null => { const 금지 = nameRe.test(control.value); // 3. 값이 유효할 경우 null을 반환하고, 유효하지 않을 경우 검증 오류 객체를 반환합니다. return allowed ? }; }
유효성 검사기는 값이 유효하면
null
반환하고, 유효하지 않으면验证错误对象
반환합니다. 인증 오류 객체에는 일반적으로 인증 키(forbiddenName
)라는 속성이 있습니다. 해당 값은 오류 메시지({name})를 삽입하는 데 사용할 수 있는 임의 사전입니다.
템플릿 기반 양식에 사용자 정의 유효성 검사기를 추가합니다. 템플릿에 지시어를 추가하기 위해 지시어에는 validator
기능이 포함되어 있습니다. 동시에 이 지시문은 자신을 NG_VALIDATORS
제공자로 등록해야 합니다. 아래와 같이
// 1. 관련 클래스 가져오기 import { NG_VALIDATORS, Validator, AbstractControl, ValidationErrors } from '@angular/forms'; '@angular/core'에서 {Input} 가져오기 @지령({ 선택기: '[appForbiddenName]', // 2. NG_VALIDATORS 토큰 공급자의 공급자로 등록: [{provide: NG_VALIDATORS, useExisting: ForbiddenValidatorDirective, multi: true}] }) 내보내기 클래스 ForbiddenValidatorDirective는 Validator를 구현합니다. @Input('appForbiddenName') allowedName = ''; // 3. 유효성 검사기 인터페이스를 구현합니다. 즉, 유효성 검사 함수를 구현합니다. verify(control: AbstractControl): ValidationErrors null { // 값이 유효하면 null을 반환하고, 유효하지 않으면 유효성 검사 오류 객체를 반환합니다. return this.forbiddenName ? : null; } } // 4. 사용자 정의 검증 기능 내보내기 기능 allowedNameValidator(nameRe: RegExp): ValidatorFn { 반환(컨트롤: AbstractControl): ValidationErrors null => { const 금지 = nameRe.test(control.value); // 3. 값이 유효할 경우 null을 반환하고, 유효하지 않을 경우 검증 오류 객체를 반환합니다. return allowed ? }; }
사용자 정의 유효성 검사 지시문은
useClass
대신useExisting
사용하여 인스턴스화됩니다.useExisting
대신useClass
사용하면 새 클래스 인스턴스가 등록되지만forbiddenName
없습니다.
<input type="text" 필수 appForbiddenName="bob" [(ngModel)]="hero.name">