Je travaille sur un formulaire de connexion et si l'utilisateur entre des informations d'identification non valides, nous voulons marquer les champs e-mail et mot de passe comme non valides et afficher un message indiquant que la connexion a échoué. Comment puis-je définir ces champs pour qu'ils ne soient pas valides à partir d'un rappel observable?
Modèle:
<form #loginForm="ngForm" (ngSubmit)="login(loginForm)" id="loginForm">
<div class="login-content" fxLayout="column" fxLayoutAlign="start stretch">
<md-input-container>
<input mdInput placeholder="Email" type="email" name="email" required [(ngModel)]="email">
</md-input-container>
<md-input-container>
<input mdInput placeholder="Password" type="password" name="password" required [(ngModel)]="password">
</md-input-container>
<p class='error' *ngIf='loginFailed'>The email address or password is invalid.</p>
<div class="extra-options" fxLayout="row" fxLayoutAlign="space-between center">
<md-checkbox class="remember-me">Remember Me</md-checkbox>
<a class="forgot-password" routerLink='/forgot-password'>Forgot Password?</a>
</div>
<button class="login-button" md-raised-button [disabled]="!loginForm.valid">SIGN IN</button>
<p class="note">Don't have an account?<br/> <a [routerLink]="['/register']">Click here to create one</a></p>
</div>
</form>
Méthode de connexion:
@ViewChild('loginForm') loginForm: HTMLFormElement;
private login(formData: any): void {
this.authService.login(formData).subscribe(res => {
alert(`Congrats, you have logged in. We don't have anywhere to send you right now though, but congrats regardless!`);
}, error => {
this.loginFailed = true; // This displays the error message, I don't really like this, but that's another issue.
this.loginForm.controls.email.invalid = true;
this.loginForm.controls.password.invalid = true;
});
}
En plus de définir l'indicateur non valide des entrées sur true, j'ai essayé de définir l' email.valid
indicateur sur false et de définir également le paramètre loginForm.invalid
sur true. Aucun de ces éléments ne provoque l'affichage de l'état invalide des entrées.
validation
angular
angular2-forms
efarley
la source
la source
setErros
méthode. Conseils: Vous devez ajouter le validateur requis sur votre fichier de composant. Existe-t-il également une raison spécifique d'utiliser ngModel avec des formes réactives?Réponses:
dans le composant:
et en HTML:
la source
setErrors({'incorrect': false})
ousetErrrors({})
ne travaille pas pour moisetErrrors(null)
formData.form.controls['email'].markAsTouched();
comme @ M.Farahmand mentionné ci-dessous. En utilisantsetErrors({'incorrect': true})
juste lang-invalid
classe css définie pour l'entrée. J'espère que cela aide quelqu'un.Ajout à la réponse de Julia Passynkova
Pour définir l'erreur de validation dans le composant:
Pour annuler l'erreur de validation dans le composant:
Soyez prudent en désactivant les erreurs en utilisant
null
car cela écrasera toutes les erreurs. Si vous souhaitez en conserver, vous devrez peut-être d'abord vérifier l'existence d'autres erreurs:la source
J'essayais d'appeler à l'
setErrors()
intérieur d'un gestionnaire ngModelChange sous forme de modèle. Cela n'a pas fonctionné jusqu'à ce que j'attende un tick avecsetTimeout()
:modèle:
composant:
Des pièges comme celui-ci me font préférer les formes réactives.
la source
Cannot find name 'NgModel'.
erreur pour la ligne@ViewChild('pwConfirmModel') pwConfirmModel: NgModel;
tout correctif pour ce problèmesetErrors
mais cela n'a pas fonctionné jusqu'à ce que je l'utilisesetTimeout
Dans la nouvelle version du matériau 2 dont le nom de contrôle commence par le préfixe mat setErrors () ne fonctionne pas, la réponse de Juila peut être changée en:
la source
Voici un exemple qui fonctionne:
la source
Dans mon formulaire réactif, je devais marquer un champ comme invalide si un autre champ était coché. Dans la version ng 7, j'ai fait ce qui suit:
Donc ci-dessus, lorsque je coche la case, il définit la liste déroulante comme requis et le marque comme sale. Si vous ne le marquez pas comme tel, il ne sera pas invalide (par erreur) tant que vous n'aurez pas essayé de soumettre le formulaire ou d'interagir avec lui.
Si la case à cocher est définie sur false (non cochée), nous effaçons le validateur requis dans la liste déroulante et le réinitialisons à un état vierge.
N'oubliez pas non plus de vous désabonner de la surveillance des changements de champ!
la source
Vous pouvez également changer le type de viewChild en NgForm comme dans:
Et puis référencez vos contrôles de la même manière que @Julia l'a mentionné:
La définition des erreurs sur null effacera les erreurs sur l'interface utilisateur:
la source
Bien que sa solution tardive mais suivante ait fonctionné pour moi.
la source
Pour le test unitaire:
la source