2017-08-07 13 views

答えて

2

フォームコントロールにバリデータを追加するには2つの方法があります。フォームコントロールにパラメータとしてそれらを指定することによって、不可欠なアプローチを使用して:宣言

const ctrl = new FormControl('', Validators.required); 

またはテンプレートにバリ特定のディレクティブを使用して:

<input [formControl]='ctrl' required> 

NG_VALIDATORSトークンが第二の場合に使用されます。これらのトークンは、バリデータディレクティブrequired,emailなどによって定義されます。そして、フォームディレクティブによって作成されたインジェクタ - NgFormNgModelおよび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 { 

角度に反応し、テンプレート駆動型フォームディレクティブ(NgFormNgModelNgModelGroup)を使用してバリデータを挿入:

すべてのビルトインとカスタムバリデータはこのトークンを使用して登録されていますこのトークン:


export class NgModelGroup extends AbstractFormGroupDirective implements ... { 
    ... 
    constructor(
     @Optional() @Self() @Inject(NG_VALIDATORS) validators: any[], 

同じ


NG_ASYNC_VALIDATORSトークンのために行きます。

+0

お返事ありがとうございます!非常に役に立ちますが、疑問があります。反応型の場合、バリデータクラスをインポートする理由は何ですか?これらのバリデータメソッドがあることはわかっています。 NG_VALIDATORSにすでにバリデータが登録されている場合、同じことをするように見える2つのことがあります(私が正しいかどうかはわかりません)。 – Jdsans

+0

'required'、' email'などのディレクティブを使って、あるいは 'newFormControl()'にインポートして追加することによって、バリデータを宣言的に追加することができます。私はこの情報を答えに追加します –

+0

だから、基本的にはクラスであるInjectionTokenのインスタンスであるNG_VALIDATORSの背景を見てください。だから、私はNG_VALIDATORS(クラス)を提供(プロバイダの)で使用し、 "useExisting:forwardRef(()=> EmailValidator)"を使用すると、EmailValidatorは再びクラスです。今質問ですが、これらの2つのクラスNG_VALIDATORSとEmailValidatorsは、プロバイダ内で互いに、または個別にリンクしていますか?他の質問で – Jdsans

関連する問題