ホームページ  >  記事  >  ウェブフロントエンド  >  Angular 学習におけるレスポンシブ フォームの簡単な分析

Angular 学習におけるレスポンシブ フォームの簡単な分析

青灯夜游
青灯夜游転載
2022-03-24 11:09:321956ブラウズ

この記事では、angular の学習を継続し、angular のレスポンシブ フォームについて学び、レスポンシブ フォーム モジュールのグローバル登録と基本的なフォーム コントロールの追加に関する関連知識を紹介します。みんなの役に立ちます。助けてください!

Angular 学習におけるレスポンシブ フォームの簡単な分析

レスポンシブ フォーム

Angular は、フォームを介したユーザー入力を処理する 2 つの異なる方法を提供します: レスポンシブ フォームテンプレート駆動フォーム。 [関連チュートリアルの推奨事項: "angular チュートリアル"]

  • レスポンシブ フォーム: 基礎となるフォーム オブジェクト モデルへの直接的かつ明示的なアクセスを提供します。これらは、テンプレート駆動型のフォームよりも堅牢です。フォームがアプリの重要な部分である場合、またはすでにリアクティブ フォームを使用してアプリを構築している場合は、リアクティブ フォームを使用してください。
  • テンプレート駆動型フォーム: テンプレートの命令に依存して、基礎となるオブジェクト モデルを作成および操作します。これらは、メール リストのサインアップ フォームなどの単純なフォームをアプリに追加する場合に便利です。

ここではレスポンシブ フォームのみを紹介します。テンプレート駆動のフォームについては、公式 Web サイトを参照してください:

https://angular.cn/guide/forms-概要#setup-in-template-driven-forms

レスポンシブ フォーム モジュールをグローバルに登録する ReactiveFormsModule

レスポンシブ フォーム コントロールを使用するには、以下をダウンロードする必要があります。 @angular/forms から ReactiveFormsModule パッケージをインポートし、NgModuleimports 配列に追加します。次のようにします。 app.module.ts

/***** app.module.ts *****/
import { ReactiveFormsModule } from '@angular/forms';

@NgModule({
  imports: [
    // other imports ...
    ReactiveFormsModule
  ],
})
export class AppModule { }

基本的なフォーム コントロールを追加する FormControl

フォーム コントロールを使用するには 3 つの手順があります。

  • リアクティブ フォーム モジュールをアプリケーションに登録します。このモジュールは、リアクティブ フォームで使用するいくつかのディレクティブを宣言します。

  • 新しい FormControl インスタンスを生成し、コンポーネントに保存します。

  • この FormControl をテンプレートに登録します。

フォーム コントロールを登録するには、FormControl クラスをインポートし、FormControl の新しいインスタンスを作成し、それをプロパティとして保存します。クラス 。次のように: test.component.ts

/***** test.component.ts *****/
import { Component } from '@angular/core';
import { FormControl } from '@angular/forms';

@Component({
  selector: 'app-name-editor',
  templateUrl: './name-editor.component.html',
  styleUrls: ['./name-editor.component.css']
})
export class TestComponent {
	// 可以在 FormControl 的构造函数设置初始值,这个例子中它是空字符串
  name = new FormControl('');
}

次に、次のようにコントロールをテンプレートに登録します: test.component.html

<!-- test.component.html -->
<label>
  Name: <input type="text" [formControl]="name">
</label>
<!-- input 中输入的值变化的话,这里显示的值也会跟着变化 -->
<p>name: {{ name.value }}</p>

FormControl のその他のプロパティとメソッドについては、API リファレンス マニュアルを参照してください。

https://angular.cn/api/forms/FormControl#formcontrol

フォーム コントロールを FormGroup にグループ化します

LikeFormControl のインスタンスでは、単一の入力ボックスに対応するコントロールを制御できますが、FormGroup のインスタンスでは、FormControl インスタンスのグループ (例:形)の状態。 FormGroup が作成されると、その中の各コントロールはその名前によって追跡されます。

次のデモ例を見てください: test.component.tstest.component.html

import { Component } from &#39;@angular/core&#39;;
import { FormControl, FormGroup, Validators } from &#39;@angular/forms&#39;

@Component({
  selector: &#39;app-test&#39;,
  templateUrl: &#39;./test.component.html&#39;,
  styleUrls: [&#39;./test.component.css&#39;]
})
export class TestComponent implements OnInit {
    constructor() {}

    profileForm = new FormGroup({
      firstName: new FormControl(&#39;&#39;, [Validators.required,Validators.pattern(&#39;[a-zA-Z0-9]*&#39;)]),
      lastName: new FormControl(&#39;&#39;, Validators.required),
    });
	
	onSubmit() {
		// 查看控件组各字段的值
      console.log(this.profileForm.value)
    }
}
rrree

FormGroup 他のプロパティとメソッドについては、API リファレンス マニュアルを参照してください。

https://angular.cn/api/forms/FormGroup#formgroup

よりシンプルな FormBuilder サービスを使用してコントロール インスタンスを生成します

レスポンシブフォームでは、複数のフォームを扱う必要がある場合、複数のフォームコントロールインスタンスを手動で作成するのは非常に面倒です。 FormBuilderこのサービスは、フォーム コントロールを生成するための便利なメソッドをいくつか提供します。 FormBuilder舞台裏でこれらのインスタンスを作成して返すのと同じ方法が使用されますが、使用する方が簡単です。

FormBuilder は、ReactiveFormModule によって提供される注入可能なサービス プロバイダーです。この依存関係は、コンポーネントのコンストラクターに追加するだけで注入できます。

FormBuilder サービスには 3 つのメソッドがあります: control()group()array() 。これらのメソッドは、コンポーネント クラスで FormControlFormGroup、および FormArray をそれぞれ生成するために使用されるファクトリ メソッドです。

次のデモ例を見てください: test.component.ts

<!-- profileForm 这个 FormGroup 通过 FormGroup 指令绑定到了 form 元素,在该模型和表单中的输入框之间创建了一个通讯层 -->
<!-- FormGroup 指令还会监听 form 元素发出的 submit 事件,并发出一个 ngSubmit 事件,让你可以绑定一个回调函数。 -->
<form [formGroup]="profileForm" (ngSubmit)="onSubmit()">
    <label>
<!-- 由 FormControlName 指令把每个输入框和 FormGroup 中定义的表单控件 FormControl 绑定起来。这些表单控件会和相应的元素通讯 -->
      First Name: <input type="text" formControlName="firstName">
    </label>
    <label>
      Last Name: <input type="text" formControlName="lastName">
    </label>
    <button type="submit" [disabled]="!profileForm.valid">Submit</button>
  </form>

  <p>{{ profileForm.value }}</p>
  <!-- 控件组的状态: INVALID 或 VALID -->
  <p>{{ profileForm.status }}</p>	
  <!-- 控件组输入的值是否为有效值: true 或 false-->
  <p>{{ profileForm.valid }}</p>
  <!-- 是否禁用: true 或 false-->
  <p>{{ profileForm.disabled }}</p>

比較すると、FormBuilder サービスを使用すると次のことがわかります。毎回手動で new 新しいインスタンスを作成する必要がなく、FormControlFormGroupFormArray を生成する方が便利です。

フォームバリデータバリデータ

バリデータ クラスバリデータの完全な API リストについては、API マニュアルを参照してください。

https://angular.cn/api/forms/Validators

バリデーター (Validators) 関数は、同期関数または非同期関数にすることができます。

  • 同步验证器:这些同步函数接受一个控件实例,然后返回一组验证错误或 null。你可以在实例化一个 FormControl 时把它作为构造函数的第二个参数传进去。
  • 异步验证器 :这些异步函数接受一个控件实例并返回一个 PromiseObservable,它稍后会发出一组验证错误或 null。在实例化 FormControl 时,可以把它们作为第三个参数传入。

出于性能方面的考虑,只有在所有同步验证器都通过之后,Angular 才会运行异步验证器。当每一个异步验证器都执行完之后,才会设置这些验证错误。

验证器Validators类的API

https://angular.cn/api/forms/Validators

class Validators {
  static min(min: number): ValidatorFn		// 允许输入的最小数值
  static max(max: number): ValidatorFn		// 最大数值
  static required(control: AbstractControl): ValidationErrors | null	// 是否必填
  static requiredTrue(control: AbstractControl): ValidationErrors | null
  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 | null
  static composeAsync(validators: AsyncValidatorFn[]): AsyncValidatorFn | null
}

内置验证器函数

要使用内置验证器,可以在实例化FormControl控件的时候添加

import { Validators } from &#39;@angular/forms&#39;;
...
ngOnInit(): void {
  this.heroForm = new FormGroup({
  // 实例化 FormControl 控件
    name: new FormControl(this.hero.name, [
      Validators.required,	// 验证,必填
      Validators.minLength(4),	// 长度不小于4
      forbiddenNameValidator(/bob/i) // 自定义验证器
    ]),
    alterEgo: new FormControl(this.hero.alterEgo),
    power: new FormControl(this.hero.power, Validators.required)
  });
}
get name() { return this.heroForm.get(&#39;name&#39;); }

get power() { return this.heroForm.get(&#39;power&#39;); }

自定义验证器

自定义验证器的内容请参考API手册

https://angular.cn/guide/form-validation

有时候内置的验证器并不能很好的满足需求,比如,我们需要对一个表单进行验证,要求输入的值只能为某一个数组中的值,而这个数组中的值是随程序运行实时改变的,这个时候内置的验证器就无法满足这个需求,需要创建自定义验证器。

  • 在响应式表单中添加自定义验证器。在上面内置验证器一节中有一个forbiddenNameValidator函数如下:

    import { Validators } from &#39;@angular/forms&#39;;
    ...
    ngOnInit(): void {
      this.heroForm = new FormGroup({
        name: new FormControl(this.hero.name, [
          Validators.required,
          Validators.minLength(4),
          // 1、添加自定义验证器
          forbiddenNameValidator(/bob/i)
        ])
      });
    }
    // 2、实现自定义验证器,功能为禁止输入带有 bob 字符串的值
    export function forbiddenNameValidator(nameRe: RegExp): ValidatorFn {
      return (control: AbstractControl): ValidationErrors | null => {
        const forbidden = nameRe.test(control.value);
        // 3、在值有效时返回 null,或无效时返回验证错误对象
        return forbidden ? {forbiddenName: {value: control.value}} : null;
      };
    }

    验证器在值有效时返回 null,或无效时返回验证错误对象。 验证错误对象通常有一个名为验证秘钥(forbiddenName)的属性。其值为一个任意词典,你可以用来插入错误信息({name})。

  • 在模板驱动表单中添加自定义验证器。要为模板添加一个指令,该指令包含了 validator 函数。同时,该指令需要把自己注册成为NG_VALIDATORS的提供者。如下所示:

    // 1、导入相关类
    import { NG_VALIDATORS, Validator, AbstractControl, ValidationErrors } from &#39;@angular/forms&#39;;
    import { Input } from &#39;@angular/core&#39;
    
    @Directive({
      selector: &#39;[appForbiddenName]&#39;,
      // 2、注册成为 NG_VALIDATORS 令牌的提供者
      providers: [{provide: NG_VALIDATORS, useExisting: ForbiddenValidatorDirective, multi: true}]
    })
    export class ForbiddenValidatorDirective implements Validator {
      @Input(&#39;appForbiddenName&#39;) forbiddenName = &#39;&#39;;
      // 3、实现 validator 接口,即实现 validate 函数
      validate(control: AbstractControl): ValidationErrors | null {
      	// 在值有效时返回 null,或无效时返回验证错误对象
        return this.forbiddenName ? forbiddenNameValidator(new RegExp(this.forbiddenName, &#39;i&#39;))(control)
                                  : null;
      }
    }
    // 4、自定义验证函数
    export function forbiddenNameValidator(nameRe: RegExp): ValidatorFn {
      return (control: AbstractControl): ValidationErrors | null => {
        const forbidden = nameRe.test(control.value);
        // 3、在值有效时返回 null,或无效时返回验证错误对象
        return forbidden ? {forbiddenName: {value: control.value}} : null;
      };
    }

    注意,自定义验证指令是用 useExisting 而不是 useClass 来实例化的。如果用useClass来代替 useExisting,就会注册一个新的类实例,而它是没有forbiddenName 的。

    <input type="text" required appForbiddenName="bob" [(ngModel)]="hero.name">

更多编程相关知识,请访问:编程入门!!

以上がAngular 学習におけるレスポンシブ フォームの簡単な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。