在Angular中处理表单
了解Angular中的模板驱动型和反应型表单
在Angular中处理表单
用表单处理用户输入总是应用程序的一个重要部分。应用程序使用表单使用户能够登录,更新个人资料,并执行许多其他数据输入任务。
Angular为我们提供了两种处理表单的方法。模板驱动和反应式方法。
模板驱动是指我们在HTML模板中处理大部分与表单相关的东西,让Angular通过放置一些指令来处理用户的输入,如NgForm、NgModel、NgModelGroup等。另一方面,在反应式表单中,所有与表单相关的逻辑都写在组件类本身,我们在HTML模板中写的逻辑非常少,只是为了绑定formGroup、(ngSubmit)、formControlName等东西。
让我们试着建立基本的表单,了解这两种方法。
模板驱动的表单
在模板驱动的表单中。
- 表单是使用
ngForm指令设置的 - 控件是使用
ngModel指令设置的 ngModel也提供了双向的数据绑定
为了使用模板驱动的表单,我们必须导入FormsModule
我们在app.module.ts中这样做。
import { BrowserModule } from '@angular/platform-browser';import { NgModule } from '@angular/core';import { AppComponent } from './app.component';import { FormsModule } from '@angular/forms';
之后,我们的任务是创建一个普通的HTML表单,然后将其转换为模板驱动的表单,angular为我们做到了这一点。在这里,我将创建一个基本的表单,它需要输入用户名和电子邮件。
我们所要做的就是为我们的表单添加ngForm指令,并将其设置为一个本地变量。这里我把它设置为#f。可以像下面这样做。
<form (ngSubmit)="onFormSubmit()" #f="ngForm">
ngForm 会自动为我们做以下工作。
- 将自己绑定到
<Form>指令上 - 创建一个顶级的
FormGroup实例 - 为每个子控件创建
FormControl实例,这些子控件有ngModel指令。 - 为每个
NgModelGroup指令创建FormGroup实例。
因此,我们的下一个任务是将ngModel指令添加到所有的表单控件中,我们希望angular能够接收。ngModel 将使用name 属性来为它所连接的每个Form 字段创建FormControl 实例。
现在,一旦模板准备好了,我们就可以把最后一块提交给组件的数据。
我们使用ngSubmit 事件,来提交表单数据给组件类。我们使用事件绑定(括号),将ngSubmit 绑定到组件类的onFormSubmit 方法。当用户点击提交按钮时,ngSubmit 事件将被触发。
一个添加了Angular Forms控件的简单HTML表单
在我们的组件中,我们只是记录NgForm的数据,在onFormSubmit方法中没有其他内容。
一个将记录我们的NgForm数据的组件
现在使用ng serve运行应用程序,并进入Chrome开发工具的控制台。 现在尝试添加一些数据,当点击提交时,你会看到NgForm数据被记录在控制台中(如下截图所示)。
显示记录的NgForm数据的应用程序
NgForm为我们提供了很多数据来控制我们的表单,设置验证和获取值,我们将在另一篇文章中介绍。现在,为了获取数值,我们可以做 console.log(this.myForm.values)。
Values将是一个保存数据的对象。
values: Object {
反应式表单
为了使用反应式表单,你将使用ReactiveFormsModule ,而不是FormsModule 。在你的代码编辑器中打开app.module.ts ,添加ReactiveFormsModule 。
import { BrowserModule } from '@angular/platform-browser';import { NgModule } from '@angular/core';import { ReactiveFormsModule } from '@angular/forms';import { AppComponent } from './app.component';@NgModule({ declarations: [ AppComponent ], imports: [ BrowserModule, ReactiveFormsModule, ], providers: [], bootstrap: [AppComponent]})export class AppModule { }
使用反应式表单的方法,我们的整个逻辑是在组件类本身中编写和处理的。让我们创建一个基本的HTML模板,然后转到组件类逻辑。
<form [formGroup]="myForm" (ngSubmit)="onSubmit(myForm)"> <div> <label> Name: <input formControlName="name" placeholder="Your name"> </label> </div> <div> <label> Email: <input formControlName="email" placeholder="Your email"> </label> </div> <div> <label> Message: <input formControlName="message" placeholder="Your message"> </label> </div> <button type="submit">Send</button></form>
在这里,我们使用formGroup,因为这个指令将告诉Angular把它当作一个FormGroup,并给它起了一个名字叫myForm。然后我们开发了一个基本的表单模板,允许用户输入他们的名字、电子邮件和一些信息,并通过发送按钮提交。提交与**(ngSubmit)事件绑定,在表单提交时被触发。然后,我们在每个表单字段上有一个formControlName**,这是一个指令,其值将是组件类中使用的名称。
在组件类中,我们定义了一个FormGroup,在FormGroup内有单独的FormControls。如果在新建一个FormControl ,提供了一个值,它将被用作该字段的初始值。我们还可以提供更多的参数,如内置和自定义验证数组,以及类似的异步验证,我们将在另一篇文章中介绍。
import { Component, OnInit } from '@angular/core';import { FormControl, FormGroup } from '@angular/forms';
在这里,我们不会将表单数据提交给一些外部服务器,我们只是记录所有的表单值。