Ich habe ein Problem mit der folgenden Prüffunktion:Ausgabe mit Prüffunktion auf Formularsteuerung nicht Einstellung Fehlerobjekt
export function validateEmailKnownFactory(userAccountService: UserAccountService): {[key: string]: any} {
return (control: AbstractControl) => {
return control
.valueChanges
.debounceTime(1000)
.switchMap(value => userAccountService.checkAvailability(value))
.map(res => {
if (res.json() === false) {
return null;
}
//Control flow does get through here
return {emailKnownValidator: {unknown: true}};
});
};
}
Es ist nicht das Fehlerobjekt Einstellung (dh {emailKnownValidator: {unknown: true}}
) auf dem Formular Kontrolle, aber der Steuerfluss kommt durch den richtigen Ort.
Nun, wenn ich ersetzen die obige Funktion mit dem folgenden:
export function validateEmailKnownFactory(userAccountService: UserAccountService): {[key: string]: any} {
return (control: AbstractControl) => {
return userAccountService.checkAvailability(control.value)
.map(res => {
if (res.json() === false) {
return null;
}
return {emailKnownValidator: {unknown: true}};
});
};
}
das Fehlerobjekt wird fein auf dem Formular Kontrolle und die Anwendung verhält sich wie erwartet.
Beachten Sie den Unterschied: Ich erhalte die Observable
von control.valueChanges
und ich rufe debounceTime
auf sie, während die andere Funktion direkt nur checkAvailability
nennen.
Der Vollständigkeit halber ist hier die checkAvailability
Methode:
checkAvailability(email: string) {
let body = 'email=' + email;
return this.http.get(this.urls.USER_ACCOUNT.EMAIL_AVAILABLE + body);
}
Danke für diese detaillierte Erklärung. Es gibt einen letzten Punkt, den ich Ihnen dankbar wäre, um zu verdeutlichen: Wollen Sie sagen, dass "debounceTime" nicht die gewünschte Wirkung erzielen wird, weil das Observable "* abonniert *" ist? – balteo
Die Umwandlung in ein 'Versprechen' wird ein Abonnement beinhalten, aber das ist nicht wirklich, wo das Problem liegt. Es ist diese Tatsache, dass jeder Aufruf an den Validator seinen eigenen zusammengesetzten "Observable" zurückgibt, der "valueChanges" zu dem HTTP-basierten "Observable" von "checkAvailability" kettet, so dass jeder Aufruf immer die letzte Änderung in checkAvailability sehen wird '. Sie könnten 'debounceTime' verwenden, um ein' Observable' zu komponieren, um den gewünschten Effekt zu erzielen, aber Sie können es nicht innerhalb des Validators erstellen, da dies dazu führt, dass jeder Aufruf ein separates 'Observable' erstellt. – cartant
Ich hoffe, das macht Sinn. Es wird ein bisschen spät, hier. – cartant