跟着官网学Angular-创建响应式表单-源代码

效果:

 app-module.ts

 1 import { BrowserModule } from '@angular/platform-browser';
 2 import { NgModule } from '@angular/core';
 3 
 4 import { AppComponent } from './app.component';
 5 
 6 import { ReactiveFormsModule } from '@angular/forms';
 7 import { NameEditComponent } from './components/name-edit/name-edit.component';
 8 import { ProfileEditorComponent } from './components/profile-editor/profile-editor.component';
 9 import { NewProfileEditorComponent } from './components/new-profile-editor/new-profile-editor.component';
10 @NgModule({
11   declarations: [
12     AppComponent,
13     NameEditComponent,
14     ProfileEditorComponent,
15     NewProfileEditorComponent
16   ],
17   imports: [
18     BrowserModule,
19     ReactiveFormsModule
20   ],
21   providers: [],
22   bootstrap: [AppComponent]
23 })
24 export class AppModule { }

app-component.html

1 <app-name-edit></app-name-edit>
2 <hr>
3 <app-profile-editor></app-profile-editor>
4 <hr>
5 <app-new-profile-editor></app-new-profile-editor>

单个控件:name-edit

ts:

 1 /*
 2 *目的:演示使用FormControl创建表单控件,并且实现设值setValue
 3  */
 4 import { Component, OnInit } from '@angular/core';
 5 import { FormControl } from '@angular/forms';
 6 
 7 @Component({
 8   selector: 'app-name-edit',
 9   templateUrl: './name-edit.component.html',
10   styleUrls: ['./name-edit.component.css']
11 })
12 export class NameEditComponent implements OnInit {
13   name = new FormControl('');
14   constructor() { }
15 
16   ngOnInit(): void {
17   }
18   updateName(): void {
19     this.name.setValue('Nancy');
20   }
21 }

html:

 1 <div class="box">
 2   <label >
 3     Name:
 4     <input class="input-text" type="text" [formControl]="name">
 5   </label>
 6   <p>
 7     Value: {{ name.value }}
 8   </p>
 9   <p>
10     <button (click)="updateName()">Update Name</button>
11   </p>
12 </div>

css:

 1 .box{
 2   width: 300px;
 3   height: 200px;
 4   position: relative;
 5   left:40%;
 6   border:1px dashed black;
 7   border-radius: 45pt/20pt;
 8 }
 9 .input-text{
10   border:2px solid lightskyblue;
11   box-shadow: 0 0 8px 2px rgba(0,0,0,0.23);
12   position: relative;
13   left: 10px;
14 }
15 label,p{
16   position: relative;
17   top: 10px;
18   left:10px;
19 }

使用FormGroup创建控件组:profile-editor

ts:

 1 /*
 2 *目的:演示使用FormGroup创建控件组,并且实现表单设值patchValue
 3  */
 4 import { Component, OnInit } from '@angular/core';
 5 import { FormControl, FormGroup } from '@angular/forms';
 6 
 7 @Component({
 8   selector: 'app-profile-editor',
 9   templateUrl: './profile-editor.component.html',
10   styleUrls: ['./profile-editor.component.css']
11 })
12 export class ProfileEditorComponent implements OnInit {
13 
14   constructor() { }
15   profileForm = new FormGroup({
16     firstName: new FormControl(''),
17     lastName: new FormControl(''),
18     address: new FormGroup({
19       street: new FormControl(''),
20       city: new FormControl(''),
21       state: new FormControl(''),
22       zip: new FormControl('')
23     })
24   });
25 
26   ngOnInit(): void {
27   }
28   onSubmit(): void {
29     // TODO: Use EventEmitter with form value
30     console.warn(this.profileForm.value);
31   }
32   updateProfile(): void {
33     this.profileForm.patchValue({
34       firstName: 'Nancy',
35       address: {
36         street: '123 Drew Street'
37       }
38     });
39   }
40 }

html:

 1 <form [formGroup]="profileForm" (ngSubmit)="onSubmit()">
 2 
 3   <label>
 4     First Name:
 5     <input type="text" formControlName="firstName">
 6   </label>
 7 
 8   <label>
 9     Last Name:
10     <input type="text" formControlName="lastName">
11   </label>
12 
13   <div formGroupName="address">
14     <h3>Address</h3>
15 
16     <label>
17       Street:
18       <br>
19       <input type="text" formControlName="street">
20     </label>
21     <br>
22     <label>
23       City:
24       <br>
25       <input type="text" formControlName="city">
26     </label>
27     <br>
28     <label>
29       State:
30       <br>
31       <input type="text" formControlName="state">
32     </label>
33     <br>
34     <label>
35       Zip Code:
36       <br>
37       <input type="text" formControlName="zip">
38     </label>
39   </div>
40 
41   <p>
42     <button type="submit" [disabled]="!profileForm.valid">Submit</button>
43   </p>
44 
45   <p>
46     <button (click)="updateProfile()">Update Profile</button>
47   </p>
48 </form>

css:

 1 form{
 2   width: 300px;
 3   height: 400px;
 4   position: relative;
 5   left:40%;
 6   border:1px dashed black;
 7   border-radius: 45pt/20pt;
 8 }
 9 input{
10   border:2px solid lightskyblue;
11   box-shadow: 0 0 8px 2px rgba(0,0,0,0.23);
12   position: relative;
13   left:10px;
14 }
15 label,p{
16   position: relative;
17   top: 10px;
18   left:10px;
19 }

使用FormBuilder创建控件组:new-profile-editor

ts:

 1 /*
 2 *目的:演示使用FormBuilder创建控件组,并且实现简单的表单验证以及表单设值patchValue
 3  */
 4 import { Component, OnInit } from '@angular/core';
 5 import {FormBuilder} from '@angular/forms';
 6 import { Validators } from '@angular/forms';
 7 
 8 @Component({
 9   selector: 'app-new-profile-editor',
10   templateUrl: './new-profile-editor.component.html',
11   styleUrls: ['./new-profile-editor.component.css']
12 })
13 export class NewProfileEditorComponent implements OnInit {
14 
15   profileForm = this.fb.group({
16     firstName: ['', Validators.required],
17     lastName: [''],
18     address: this.fb.group({
19       street: [''],
20       city: [''],
21       state: [''],
22       zip: ['']
23     }),
24   });
25   constructor(private fb: FormBuilder) { }
26 
27   ngOnInit(): void {
28   }
29   onSubmit(): void {
30     // TODO: Use EventEmitter with form value
31     console.warn(this.profileForm.value);
32   }
33   updateProfile(): void {
34     this.profileForm.patchValue({
35       firstName: 'Nancy',
36       address: {
37         street: '123 Drew Street'
38       }
39     });
40   }
41 }

html:

 1 <form [formGroup]="profileForm" (ngSubmit)="onSubmit()">
 2 
 3   <label>
 4     First Name:
 5     <input type="text" formControlName="firstName">
 6   </label>
 7 
 8   <label>
 9     Last Name:
10     <input type="text" formControlName="lastName" required>
11   </label>
12 
13   <div formGroupName="address">
14     <h3>Address</h3>
15 
16     <label>
17       Street:
18       <br>
19       <input type="text" formControlName="street">
20     </label>
21     <br>
22     <label>
23       City:
24       <br>
25       <input type="text" formControlName="city">
26     </label>
27     <br>
28     <label>
29       State:
30       <br>
31       <input type="text" formControlName="state">
32     </label>
33     <br>
34     <label>
35       Zip Code:
36       <br>
37       <input type="text" formControlName="zip">
38     </label>
39   </div>
40 
41   <p>
42     <button type="submit" [disabled]="!profileForm.valid">Submit</button>
43   </p>
44 
45   <p>
46     <button (click)="updateProfile()">Update Profile</button>
47   </p>
48   <p>
49     Form Status: {{ profileForm.status }}
50   </p>
51 </form>

css:

 1 form{
 2   width: 300px;
 3   height: 420px;
 4   position: relative;
 5   left:40%;
 6   border:1px dashed black;
 7   border-radius: 45pt/20pt;
 8 }
 9 input{
10   border:2px solid lightskyblue;
11   box-shadow: 0 0 8px 2px rgba(0,0,0,0.23);
12   position: relative;
13   left:10px;
14 }
15 label,p{
16   position: relative;
17   top: 10px;
18   left:10px;
19 }
由于无法解释的神圣旨意,我们徒然地到处找你;你就是孤独,你就是神秘,比恒河或者日落还要遥远。。。。。。
原文地址:https://www.cnblogs.com/momoli/p/13845279.html