CanActivate hace que el botón de navegación se haga clic dos veces para que la pantalla cambie
Tengo esta señal en el método. Cuando trato de construir en mi módulo de enrutamiento, el signo en el botón debe ser pulsado dos veces para ser navegado a la siguiente pantalla. Pero la cadena de registro de la consola que imprimí aparece la primera vez. Así que parece que la navegación no funciona la primera vez.
Si hago clic en iniciar sesión una vez y refrescar la página, me lleva a la siguiente página automáticamente como muestra que estoy firmado. Así que su navegación del router que no funciona la primera vez. No puedo averiguar qué salió mal. ¿Alguna idea?
sign in component
public signIn(email: string, password: string) {
this.authService.signIn(email, password)
.then(() => {
console.log("Signed In")
this.router.navigate(["/control-panel"])
})
.catch(() => {
this.errorText = this.sanitizer.bypassSecurityTrustHtml("Please enter valid email and password")
})
}
Routing.module
const redirectLoggedInToControlPanel = () => redirectLoggedInTo(['/control-panel']);
const routes: Routes = [{ path: 'sign-in', component: SignInComponent, ...canActivate(redirectLoggedInToControlPanel) }]
Iniciar sesión html
Pregunta hecha hace 3 años, 4 meses, 28 días - Por techsavvypro
2 Respuestas:
-
El problema que estás experimentando parece estar relacionado con el uso de la función
canActivate
en tu enrutador. Cuando usascanActivate
, estás especificando una serie de condiciones que se deben cumplir antes de que se permita la navegación a una determinada ruta. En tu caso, estás redirigiendo automáticamente a los usuarios que ya han iniciado sesión a la ruta '/control-panel'.El problema es que cuando el usuario inicia sesión con éxito, el enrutador intenta navegar automáticamente a '/control-panel' utilizando
this.router.navigate(["/control-panel"])
, pero como ya estás en esa ruta debido a la redirección delcanActivate
, puede que no se produzca un cambio perceptible en la pantalla. Esto puede explicar por qué parece que tienes que hacer clic dos veces en el botón para que la pantalla cambie.Para solucionar este problema, puedes intentar lo siguiente:
- Elimina la redirección automática en el método `signIn` y deja que el enrutador maneje la redirección después de que se haya completado la navegación:
typescript public signIn(email: string, password: string) { this.authService.signIn(email, password) .then(() => { console.log("Signed In") this.router.navigate(["/control-panel"]) }) .catch(() => { this.errorText = this.sanitizer.bypassSecurityTrustHtml("Please enter valid email and password") }) }
- Asegúrate de que tu ruta '/control-panel' tenga la propiedad `canActivate` si es necesario para restringir el acceso a usuarios no autenticados.
- En tu componente de `sign-in`, asegúrate de que el botón de inicio de sesión esté vinculado al evento `click` en lugar de `input`. De esta manera, el método `signIn` se llamará solo cuando se haga clic en el botón:
html
Con estos ajustes, el problema de tener que hacer clic dos veces debería resolverse y la navegación debería funcionar correctamente la primera vez que se inicia sesión.
Respondida el Dec 18, 2020 a las 22:12 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
El problema es que el evento
(click)
se está disparando dos veces. Esto se debe a que el botón está dentro de un formulario. Cuando se hace clic en el botón, el evento(click)
se dispara una vez para el botón y otra vez para el formulario.Para resolver este problema, puedes hacer que el botón envíe el formulario usando el atributo
(submit)
en lugar del atributo(click)
.html
Respondida el Dec 18, 2020 a las 22:23 - por Gemini
Votos positivos: 0 | Votos negativos: 0