Estoy trabajando en un formulario de inicio de sesión y si el usuario ingresa credenciales no válidas, queremos marcar los campos de correo electrónico y contraseña como no válidos y mostrar un mensaje que dice que el inicio de sesión falló. ¿Cómo hago para configurar estos campos como no válidos desde una devolución de llamada observable?
Modelo:
<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étodo de inicio de sesión:
@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;
});
}
Además de establecer el indicador inválido de entradas en verdadero, he intentado establecer el email.valid
indicador en falso y establecer también loginForm.invalid
en verdadero. Ninguno de estos hace que las entradas muestren su estado no válido.
validation
angular
angular2-forms
efarley
fuente
fuente
setErros
método. Consejos: debe agregar el validador requerido en su archivo componente. ¿También hay una razón específica para usar ngModel con formas reactivas?Respuestas:
en componente:
y en HTML:
fuente
setErrors({'incorrect': false})
osetErrrors({})
no están trabajando para mísetErrrors(null)
formData.form.controls['email'].markAsTouched();
@ M.Farahmand mencionado a continuación. UsandosetErrors({'incorrect': true})
solo establece lang-invalid
clase css para la entrada. Espero que esto ayude a alguien.Agregando a la respuesta de Julia Passynkova
Para configurar el error de validación en el componente:
Para desarmar el error de validación en el componente:
Tenga cuidado al desarmar los errores,
null
ya que esto sobrescribirá todos los errores. Si desea conservar algunos, es posible que primero deba verificar la existencia de otros errores:fuente
Estaba tratando de llamar
setErrors()
dentro de un controlador ngModelChange en forma de plantilla. No funcionó hasta que esperé una marca consetTimeout()
:modelo:
componente:
Las trampas como esta me están haciendo preferir formas reactivas.
fuente
Cannot find name 'NgModel'.
error para la línea@ViewChild('pwConfirmModel') pwConfirmModel: NgModel;
cualquier solución para este problemasetErrors
pero no funcionó hasta que lo usésetTimeout
En la nueva versión del material 2, cuyo nombre de control comienza con el prefijo mat setErrors () no funciona, en cambio, la respuesta de Juila se puede cambiar a:
fuente
Aquí hay un ejemplo que funciona:
fuente
En mi forma Reactiva, necesitaba marcar un campo como no válido si se marcaba otro campo. En ng versión 7 hice lo siguiente:
Por lo tanto, cuando marque la casilla, establece el menú desplegable según sea necesario y lo marca como sucio. Si no lo marca como tal, no será inválido (por error) hasta que intente enviar el formulario o interactuar con él.
Si la casilla de verificación está configurada como falsa (sin marcar), borramos el validador requerido en el menú desplegable y lo restablecemos a un estado prístino.
Además, ¡recuerde darse de baja de los cambios de campo de monitoreo!
fuente
También puede cambiar el 'tipo' viewChild a NgForm como en:
Y luego haga referencia a sus controles de la misma manera que @Julia mencionó:
Establecer los errores en nulo borrará los errores en la interfaz de usuario:
fuente
Aunque su solución tardía pero siguiente funcionó de mí.
fuente
Para prueba unitaria:
fuente