七.利用 Angular 的响应式表单,让零基础用户一个月内能够制作服务
上一次,通过实践运用之前所学的知识,我加深了对Angular的了解。
在本文中,我们将学习如何使用响应式表单来编写不使用 [ngModel] 的表单。
-
- ReactiveFormの基礎
-
- [(ngModel)] をFormGroup, FormControlで書き換える
- Formの送信による保存処理
我会继续做下去。
这篇文章的源代码
https://github.com/seteen/AngularGuides/tree/Introduction07 的原文需要翻译成中文
Angular中表单元素的基础
目前的 product-edit.component.ts 使用 [(ngModel)] 将表单的每个元素与产品的各个要素对应起来。
在Angular中,为了处理与表单相关联的操作,提供了专门的类进行处理。
关于每一个,我将逐步解释。
クラス役割FormControl
<input>
などの入力要素一つに対応するクラスFormGroup<form>
要素に対応するクラスFormBuilderFormGroup, FormControl を作成するクラス与使用 [(ngModel)] 的示例相对应
考虑到当前的product-edit.component.ts,对应关系如下所示。
クラス役割product-edit.componentFormControl
<input>
などの入力要素一つに対応するクラスproduct
FormGroup<form>
要素に対応するクラスproduct.name
FormBuilderFormGroup, FormControl を作成するクラスなし将 [(ngModel)] 替换为 FormGroup、FormControl 写法
首先,我们会从Typescript开始进行重写。
import { Component, OnInit } from '@angular/core';
import { Product } from '../../shared/models/product';
import { ProductService } from '../../shared/services/product.service';
import { ActivatedRoute, Params, Router } from '@angular/router';
import { FormBuilder } from '@angular/forms';
@Component({
selector: 'app-product-edit',
templateUrl: './product-edit.component.html',
styleUrls: ['./product-edit.component.scss']
})
export class ProductEditComponent implements OnInit {
productForm = this.fb.group({ // <= 変更
id: [''],
name: [''],
price: [''],
description: [''],
});
constructor(
private route: ActivatedRoute,
private router: Router,
private fb: FormBuilder, // <= 追加
private productService: ProductService,
) {}
ngOnInit() {
this.route.params.subscribe((params: Params) => {
this.productService.get(params['id']).subscribe((product: Product) => {
this.productForm.setValue({ // <= 変更
id: product.id,
name: product.name,
price: product.price,
description: product.description,
});
});
});
}
saveProduct(): void {
this.router.navigate(['/products']);
}
}
讲解
构造函数部分
在代码中添加了FormBuilder。
变量定义部分
我删除了product变量,并添加了productForm变量。
产品的形式是FormGroup。使用this.fb.group()函数创建一个FormGroup。
这个方法的参数是作为表单元素值的键和初始值(数组的形式是为了能够在第二个以后的位置放入验证器,这将在后面解释)。
换句话说,这里我们正在创建一个具有与 product 相同的元素(id、name、price、description)的 FormGroup。
另外,每个名字:[”] 是一个表单控件。
我会在下面写下不使用FormBuilder就可以实现类似功能的代码,因为使用FormBuilder不太容易理解哪些元素属于哪个类。
productForm = new FormGroup({
id: new FormControl(''),
name: new FormControl(''),
price: new FormControl(''),
description: new FormControl(''),
});
ngOnInit 部分
在从产品服务中取出产品后,将当前产品的值放入产品表单中。
使用 HTML 中的 FormGroup、FormControl
<div class="container">
<div class="title">商品編集</div>
<form (ngSubmit)="saveProduct()" [formGroup]="productForm">
<div class="edit-form">
<div class="edit-line">
<label>ID</label>
<span>{{ productForm.controls.id.value }}</span>
</div>
<div class="edit-line">
<label>名前</label>
<input type="text" formControlName="name" required>
</div>
<div class="edit-line">
<label>価格</label>
<input type="number" formControlName="price">
</div>
<div class="edit-line">
<label>説明</label>
<input type="text" formControlName="description">
</div>
</div>
<div class="footer">
<span class="button white" [routerLink]="['/products', productForm.controls.id.value]">キャンセル</span>
<button class="button black">保存</button>
</div>
</form>
</div>
通过在