我對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
你有兩種方式來驗證添加到表單控件。通過指定它們作爲參數來表單控件使用勢在必行的方法:
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 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
令牌。
謝謝你的回覆!這是非常有用的,但我有疑問....對於反應形式,爲什麼我們要導入驗證器類。我知道它有這些驗證方法。如果NG_VALIDATORS已經註冊了這些驗證器,爲什麼有兩件事情看起來像做同樣的事情(不確定我是否正確)? – Jdsans
您可以使用指令 - 「必需」,「電子郵件」等或通過導入並將它們添加到「新的FormControl()」中來聲明性地添加驗證程序。我會將這些信息添加到答案 –
好的,我只是看一下NG_VALIDATORS的背景,它是InjectionToken的一個實例,它基本上是一個類。因此,當我在提供者(提供者)中使用NG_VALIDATORS(這是一個類)並使用「useExisting:forwardRef((=)=> EmailValidator)」時,其中EmailValidator又是一個類。現在的問題是,這兩個類NG_VALIDATORS和EmailValidators如何在提供者中彼此鏈接或單獨鏈接? – Jdsans