NG_VALIDATORSの使い方が混乱しています。私はそれがプロバイダートークンであることを知っています。しかし、その使用は何ですか?それはどのようなフォームバリデータクラスでもどうですか?NG_VALIDATORSとバリデーター(クラス)の違い
https://github.com/angular/angular/blob/4.3.3/packages/forms/src/validators.ts
NG_VALIDATORSの使い方が混乱しています。私はそれがプロバイダートークンであることを知っています。しかし、その使用は何ですか?それはどのようなフォームバリデータクラスでもどうですか?NG_VALIDATORSとバリデーター(クラス)の違い
https://github.com/angular/angular/blob/4.3.3/packages/forms/src/validators.ts
フォームコントロールにバリデータを追加するには2つの方法があります。フォームコントロールにパラメータとしてそれらを指定することによって、不可欠なアプローチを使用して:宣言
const ctrl = new FormControl('', Validators.required);
またはテンプレートにバリ特定のディレクティブを使用して:
<input [formControl]='ctrl' required>
NG_VALIDATORS
トークンが第二の場合に使用されます。これらのトークンは、バリデータディレクティブrequired
,email
などによって定義されます。そして、フォームディレクティブによって作成されたインジェクタ - NgForm
、NgModel
およびNgModelGroup
で定義されています。独自のインジェクタを作成するディレクティブの詳細については、How exactly works the services hierarchy in this Angular 2 application?を参照してください。
export const EMAIL_VALIDATOR: any = {
provide: NG_VALIDATORS,
useExisting: forwardRef(() => EmailValidator),
multi: true
};
@Directive({
selector: '[email]...',
providers: [EMAIL_VALIDATOR] <-------------
})
export class EmailValidator implements Validator {
export const REQUIRED_VALIDATOR: Provider = {
provide: NG_VALIDATORS,
useExisting: forwardRef(() => RequiredValidator),
multi: true
};
@Directive({
selector:
'[required]...',
providers: [REQUIRED_VALIDATOR], <-------------
})
export class RequiredValidator implements Validator {
角度に反応し、テンプレート駆動型フォームディレクティブ(NgForm
、NgModel
とNgModelGroup
)を使用してバリデータを挿入:
すべてのビルトインとカスタムバリデータはこのトークンを使用して登録されていますこのトークン:
export class NgModelGroup extends AbstractFormGroupDirective implements ... {
...
constructor(
@Optional() @Self() @Inject(NG_VALIDATORS) validators: any[],
同じ
NG_ASYNC_VALIDATORS
トークンのために行きます。
お返事ありがとうございます!非常に役に立ちますが、疑問があります。反応型の場合、バリデータクラスをインポートする理由は何ですか?これらのバリデータメソッドがあることはわかっています。 NG_VALIDATORSにすでにバリデータが登録されている場合、同じことをするように見える2つのことがあります(私が正しいかどうかはわかりません)。 – Jdsans
'required'、' email'などのディレクティブを使って、あるいは 'newFormControl()'にインポートして追加することによって、バリデータを宣言的に追加することができます。私はこの情報を答えに追加します –
だから、基本的にはクラスであるInjectionTokenのインスタンスであるNG_VALIDATORSの背景を見てください。だから、私はNG_VALIDATORS(クラス)を提供(プロバイダの)で使用し、 "useExisting:forwardRef(()=> EmailValidator)"を使用すると、EmailValidatorは再びクラスです。今質問ですが、これらの2つのクラスNG_VALIDATORSとEmailValidatorsは、プロバイダ内で互いに、または個別にリンクしていますか?他の質問で – Jdsans