No Angular, existem dois tipos de formulários,模板驱动
e模型驱动
. [Tutoriais relacionados recomendados: "Tutorial Angular"]
1.1 Visão geral
控制逻辑
do formulário é escrita no组件模板
, que é adequado para tipos de formulário简单
.
1.2 Comece rapidamente
1). Apresente o módulo dependente FormsModule
import { FormsModule } from "@angular/forms" @NgModule({ importações: [FormsModule], }) export class AppModule {}
2) Converta o formulário DOM em ngForm
<form #f="ngForm" (submit)="onSubmit(f)"></form>
3) Declare o campo do formulário como ngModel
<form #f= " ngForm" (enviar)="onSubmit(f)"> <input type="text" name="nome de usuário" ngModel /> <botão>Enviar</button> </form>
4). Obtenha o valor do campo do formulário
import { NgForm } de "@angular/forms" classe de exportação AppComponent { onSubmit(formulário: NgForm) { console.log(form.value) // {nome de usuário: ''} } }
5), agrupamento de formulários
<form #f="ngForm" (submit)="onSubmit(f)"> <div ngModelGroup="usuário"> <input type="text" name="nome de usuário" ngModel /> </div> <div ngModelGroup="contato"> <input type="text" name="phone" ngModel /> </div> <botão>Enviar</button> </form>
importe { NgForm } de "@angular/forms" classe de exportação AppComponent { onSubmit(formulário: NgForm) { console.log(form.value) // {contato: {telefone: ''}, usuário:{nome de usuário: ''}} } }
1.3 Validação de formulário campo
<form #f="ngForm" (submit)="onSubmit(f)"> <input type="text" name="username" ngModel requer padrão="d" /> <botão>Enviar</button> </form>
exportar classe AppComponent { onSubmit(formulário: NgForm) { // Verifica se todo o formulário foi verificado através de console.log(form.valid) } }
<!-- Desabilitar o envio do formulário quando todo o formulário falhar na validação --> <button type="submit" [disabled]="f.invalid">Enviar</button>
exibe a mensagem de erro quando o item do formulário falha no modelo de componente.
<form #f="ngForm" (submit)="onSubmit(f)"> <input #username="ngModel" /> <div *ngIf="nome de usuário.touched && !nome de usuário.valid && nome de usuário.errors"> <div *ngIf="username.errors.required">Por favor, preencha o nome de usuário</div> <div *ngIf="username.errors.pattern">Não está em conformidade com as regras regulares</div> </div> </form>
Especifica o estilo quando o item do formulário falha na validação.
input.ng-touched.ng-inválido { borda: 2px vermelho sólido; }
2.1 Visão geral
控制逻辑
do formulário é escrita na组件类
, que tem mais controle sobre a lógica de verificação e é adequada para tipos de formulário复杂
.
Em um formulário baseado em modelo, o campo do formulário precisa ser uma instância da classe FormControl
. O objeto de instância pode验证表单字段
, se o valor foi modificado, etc.
Um conjunto de campos de formulário constitui o formulário inteiro, e todo o formulário precisa ser uma instância da classe FormGroup
, que pode realizar a validação整体
no formulário.
FormControl: um item de formulário em um grupo de formulários.
FormGroup: um grupo de formulários.
Durante a validação do formulário, um item no FormArray. falha e o todo falha.
2.2 Comece rapidamente
1), introduza ReactiveFormsModule
import { ReactiveFormsModule } from "@angular/forms" @NgModule({ importações: [ReactiveFormsModule] }) export class AppModule {}
2). Crie o objeto de controle de formulário FormGroup na classe de componente
import { FormControl, FormGroup } de "@angular/forms" classe de exportação AppComponent { contactForm:FormGroup = new FormGroup({ nome: novo FormControl(), telefone: novo FormControl() }) }
3). Formulário no modelo de componente associado
<form [formGroup]="contactForm" (submit)="onSubmit()"> <input type="text" formControlName="nome" /> <input type="text" formControlName="telefone" /> <botão>Enviar</button> </form>
4). Obtenha o valor do formulário
export class AppComponent { onSubmit() { console.log(this.contactForm.value) } }
5). Defina o valor padrão do formulário
contactForm: FormGroup = new FormGroup({ nome: novo FormControl("Valor padrão"), telefone: novo FormControl (15888888888) })
6), agrupamento de formulários
contactForm: FormGroup = new FormGroup({ nome completo: novo FormGroup({ primeiroNome: novo FormControl(), sobrenome: novo FormControl() }), telefone: novo FormControl() })
<form [formGroup]="contactForm" (submit)="onSubmit()"> <div formGroupName="nome completo"> <input type="text" formControlName="firstName" /> <input type="text" formControlName="sobrenome" /> </div> <input type="text" formControlName="telefone" /> <botão>Enviar</button> </form>
onSubmit() { console.log(este.contactForm.valor.nome.nomedeusuário) console.log(this.contactForm.get(["nome", "nome de usuário"])?.valor) }
2.3
Requisitos do FormArray: Um grupo de informações de contato é exibido na página por padrão e mais grupos de informações de contato podem ser adicionados clicando no botão.
importar { Componente, OnInit } de "@angular/core" importar {FormArray, FormControl, FormGroup} de "@angular/forms" @Componente({ seletor: "app-root", templateUrl: "./app.component.html", estilos: [] }) classe de exportação AppComponent implementa OnInit { // formulário contactForm: FormGroup = new FormGroup({ contatos: novo FormArray([]) }) obter contatos() { retorne this.contactForm.get("contatos") como FormArray } //Adicionar informações de contato addContact() { //Informações de contato const myContact: FormGroup = new FormGroup({ nome: novo FormControl(), endereço: novo FormControl(), telefone: novo FormControl() }) //Adiciona informações de contato à matriz de informações de contato this.contacts.push(myContact) } // Excluir informações de contato removeContact(i: number) { this.contacts.removeAt(i) } ngOnInit() { //Adiciona informações de contato padrão this.addContact() } onSubmit() { console.log(this.contactForm.value) } }
<form [formGroup]="contactForm" (submit)="onSubmit()"> <div formArrayName="contatos"> <div *ngFor="deixe contato de contatos.controles; deixe i = index" [formGroupName]="i" > <input type="text" formControlName="nome" /> <input type="text" formControlName="address" /> <input type="text" formControlName="telefone" /> <button (click)="removeContact(i)">Remover informações de contato</button> </div> </div> <button (click)="addContact()">Adicionar informações de contato</button> <botão>Enviar</button> </form>
2.4 Validador de formulário integrado
1) Use as regras de validação fornecidas pelo validador integrado para validar os campos do formulário
import { FormControl, FormGroup, Validators } from "@angular/forms" contactForm:FormGroup = new FormGroup({ nome: new FormControl("Valor padrão", [ Validadores.obrigatórios, Validadores.minLength(2) ]) })
2). Verifique se todo o formulário passou na verificação
onSubmit() { console.log(this.contactForm.valid) }
<!-- Desativar botões do formulário quando todo o formulário falhar na verificação --> <button [disabled]="contactForm.invalid">Enviar</button>
3). Exibe a mensagem de erro quando a verificação é aprovada no modelo de componente
get name() {). retorne this.contactForm.get("nome")! }
<form [formGroup]="contactForm" (submit)="onSubmit()"> <input type="text" formControlName="nome" /> <div *ngIf="nome.touched && nome.inválido && nome.errors"> <div *ngIf="name.errors.required">Por favor, preencha seu nome</div> <div *ngIf="name.errors.maxlength"> O comprimento do nome não pode ser maior que {{ name.errors.maxlength.requiredLength }}. O comprimento real é {{ name.errors.maxlength.actualLength }}. </div> </div> </form>
2.5 Validador de formulário síncrono customizado
O tipo de validador customizado é a classe TypeScript
. A classe contém métodos de verificação específicos. O método de verificação deve ser um método estático.
O método de verificação possui um controle de parâmetro, do tipo AbstractControl. Na verdade, é o tipo de objeto de instância da classe FormControl.
Se a verificação for bem-sucedida, será retornado nulo.
Se a verificação falhar, o objeto será retornado. verdadeiro, indicando que a verificação falhou.
O valor de retorno do método de verificação é ValidationErrors | null
import { AbstractControl, ValidationErrors } from "@angular/forms" exportar classe NameValidators { // Os valores dos campos não podem conter espaços static canContainSpace(control: AbstractControl): ValidationErrors | // Falha na verificação if (/s/.test(control.value)) return { não podeContainSpace: true } //Verificação passada retorna nulo } }
importar {NameValidators} de "./Name.validators" contactForm:FormGroup = new FormGroup({ nome: novo FormControl("", [ Validadores.obrigatórios, NameValidators.cannotContainSpace ]) })
<div *ngIf="nome.touched && nome.invalid && nome.errors"> <div *ngIf="name.errors.cannotContainSpace">O nome não pode conter espaços</div> </div>
2.6 Importação do validador de formulário assíncrono personalizado
{ AbstractControl, ValidationErrors } de "@angular/forms" importar {Observável} de "rxjs" exportar classe NameValidators { static deveriaBeUnique(controle: AbstractControl): Promise<ValidationErrors | null> { retornar nova promessa(resolver => { if (control.value == "admin") { resolver({deve serUnique: verdadeiro}) } outro { resolver (nulo) } }) } }
contactForm: FormGroup = new FormGroup({ nome: novo FormControl( "", [ Validadores.requeridos ], NameValidators.shouldBeUnique ) })
<div *ngIf="nome.touched && nome.invalid && nome.errors"> <div *ngIf="name.errors.shouldBeUnique">Nome de usuário duplicado</div> </div> <div *ngIf="name.pending">Detectando se nomes são duplicados</div>
2.7
快捷
do FormBuilder para criar um formulário.
this.fb.control
: item de formulário
this.fb.group
: grupo de formulários, o formulário é pelo menos um FormGroup
this.fb.array
: usado para formulários complexos, você pode adicionar itens de formulário ou grupos de formulários dinamicamente, durante a validação do formulário, há é um FormArray O item falhou e o todo falhou.
importar {FormBuilder, FormGroup, Validators} de "@angular/forms" classe de exportação AppComponent { contatoForm: FormGroup construtor(fb privado: FormBuilder) { this.contactForm = this.fb.group({ nome completo: this.fb.group({ primeiroNome: ["", [Validators.required]], sobrenome: [""] }), telefone: [] }) } }
2.8 Monitorando alterações nos valores do formulário
No trabalho real, geralmente precisamos realizar o processamento correspondente com base nas alterações no valor do formulário. Geralmente, podemos usar ngModalChange
ou um formulário para obter
2.8.1 ngModalChange
<div>. <input type="text" [(ngModal)]="nome" (ngModalChange)="nameChange()" /> </div>
importe { FormControl, FormGroup } de "@angular/forms" classe de exportação AppComponent { nome público = 'a'; nome públicoAlterar() { } }
Angular oficialmente não recomenda o uso de ngModalChange.
2.8.2 Controle de formulário
<div [formGroup]="contactForm"> <input type="text" formControlName="nome" /> </div>
importe { FormControl, FormGroup } de "@angular/forms" classe de exportação AppComponent { contactForm:FormGroup = new FormGroup({ nome: novo FormControl() }) ngOnInt() { this.contactForm.get("nome").valueChanges.subscribe(dados => { console.log(dados); } } }
2.9 Exercício
1), Obtenha o valor selecionado em um grupo de caixas de seleção
<form [formGroup]="form" (submit)="onSubmit()"> <label *ngFor="let item de dados"> <input type="checkbox" [value]="item.value" (change)="onChange($event)" /> {{ item.nome }} </label> <botão>Enviar</button> </form>
importe {Componente} de "@angular/core" importar {FormArray, FormBuilder, FormGroup} de "@angular/forms" dados de interface { nome: string valor: string } @Componente({ seletor: "caixa de seleção do aplicativo", templateUrl: "./checkbox.component.html", estilos: [] }) classe de exportação CheckboxComponent { Dados: Matriz<Dados> = [ {nome: "Pêra", valor: "pêra" }, { nome: "Ameixa", valor: "ameixa" }, {nome: "Kiwi", valor: "kiwi" }, { nome: "Apple", valor: "apple" }, {nome: "Limão", valor: "Limão" } ] formulário: FormGroup construtor(fb privado: FormBuilder) { este.form = este.fb.grupo({ checkArray: this.fb.array([]) }) } onChange(evento: Evento) { const target = event.target como HTMLInputElement const verificado = target.checked valor const = alvo.valor const checkArray = this.form.get("checkArray") as FormArray if (marcado) { checkArray.push(this.fb.control(valor)) } outro { índice const = checkArray.controls.findIndex( controle => controle.valor === valor ) checkArray.removeAt(índice) } } onSubmit() { console.log(este.formulário.valor) } }
2). Obtenha o valor selecionado no botão de opção
export class AppComponent { formulário: FormGroup construtor(fb público: FormBuilder) { this.form = this.fb.group({gênero: "" }) } onSubmit() { console.log(este.formulário.valor) } }
<form [formGroup]="form" (submit)="onSubmit()"> <input type="radio" value="male" formControlName="gender" /> Masculino <input type="radio" value="female" formControlName="gender" /> Feminino <button type="submit">Enviar</button> </form>
2.10 Outro
patchValue: Defina o valor do controle de formulário (você pode definir todos, ou você pode definir um deles, os outros não serão afetados)
setValue: Defina o valor do controle de formulário (definir todos, não pode excluir qualquer um)
valueChanges: Quando o formulário O evento de redefinição é acionado quando o valor do controle muda
: o conteúdo do formulário fica em branco