2017-08-07 9 views

Antwort

2

Sie haben zwei Möglichkeiten, Prüfungen zu einem Formular-Steuerelement hinzuzufügen. Verwendung zwingend notwendig Ansatz, indem sie als Parameter in eine Form Steuerung festgelegt wird:

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

oder deklarativ durch validator spezifische Richtlinien in der Vorlage:

<input [formControl]='ctrl' required> 

Die NG_VALIDATORS Token in dem zweiten Fall verwendet werden. Diese Token sind durch die Validierer-Direktiven required, email und andere definiert. Und sie sind auf dem Injektor definiert, der durch die Form-Direktiven NgForm, NgModel und NgModelGroup erzeugt wird. Siehe How exactly works the services hierarchy in this Angular 2 application?, um mehr über Richtlinien zu erfahren, die einen eigenen Injektor erstellen.

Alle eingebauten und benutzerdefinierten Validierer werden unter Verwendung dieser Token registriert:

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 { 

Angular Blind- und template angetrieben Form Richtlinien (NgForm, NgModel und NgModelGroup) einzuspritzen validators Verwendung Dieses Token:

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[], 

Das gleiche gilt für die NG_ASYNC_VALIDATORS Token.

+0

Vielen Dank für Ihre Antwort! Es ist sehr hilfreich, aber ich habe Zweifel ... Für reaktive Formen, warum importieren wir die Klasse Validatoren. Ich weiß, dass es diese Validator-Methoden hat. Wenn NG_VALIDATORS diese Validatoren bereits registriert haben, warum sollten zwei Dinge so aussehen, als würden sie dasselbe tun (nicht sicher, ob ich recht habe)? – Jdsans

+0

Sie können Validatoren deklarativ hinzufügen, indem Sie directives - 'required',' email' und andere oder zwingend verwenden, indem Sie sie in 'newFormControl()' importieren und hinzufügen. Ich werde diese Informationen zu der Antwort hinzufügen –

+0

Ok, so schaue ich nur auf den Hintergrund von NG_VALIDATORS, die eine Instanz von InjectionToken ist, die im Grunde eine Klasse ist. Also, wenn ich NG_VALIDATORS (eine Klasse) in der Bereitstellung (eines Providers) benutze und benutze "useExisting: forwardRef (() => EmailValidator)", wobei EmailValidator wieder eine Klasse ist. Nun die Frage, wie diese beiden Klassen NG_VALIDATORS und EmailValidator miteinander oder einzeln in einem Provider verlinken? – Jdsans

Verwandte Themen