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.
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
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 –
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