2017-08-07 12 views

回答

2

你有兩種方式來驗證添加到表單控件。通過指定它們作爲參數來表單控件使用勢在必行的方法:

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

或聲明通過使用模板中驗證特定指令:

<input [formControl]='ctrl' required> 

NG_VALIDATORS該令牌在第二種情況下使用。這些令牌由驗證器指令required,email定義。並且它們在形式指令 - NgForm,NgModelNgModelGroup創建的噴油器上定義。請參閱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 NgForm extends ControlContainer implements Form { 
    ...  
    constructor(
     @Optional() @Self() @Inject(NG_VALIDATORS) validators: any[], 

export class NgModel extends NgControl implements OnChanges, 
    ... 
    constructor(@Optional() @Self() @Inject(NG_VALIDATORS) validators..., 

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

這同樣適用於在NG_ASYNC_VALIDATORS令牌。

+0

謝謝你的回覆!這是非常有用的,但我有疑問....對於反應形式,爲什麼我們要導入驗證器類。我知道它有這些驗證方法。如果NG_VALIDATORS已經註冊了這些驗證器,爲什麼有兩件事情看起來像做同樣的事情(不確定我是否正確)? – Jdsans

+0

您可以使用指令 - 「必需」,「電子郵件」等或通過導入並將它們添加到「新的FormControl()」中來聲明性地添加驗證程序。我會將這些信息添加到答案 –

+0

好的,我只是看一下NG_VALIDATORS的背景,它是InjectionToken的一個實例,它基本上是一個類。因此,當我在提供者(提供者)中使用NG_VALIDATORS(這是一個類)並使用「useExisting:forwardRef((=)=> EmailValidator)」時,其中EmailValidator又是一個類。現在的問題是,這兩個類NG_VALIDATORS和EmailValidators如何在提供者中彼此鏈接或單獨鏈接? – Jdsans

相關問題