¿Cómo volver observable <boolean> en canActivate en una ruta guardada en angular 6

votos
0

Me gustaría guardar una ruta con una clase CanActivate. La documentación que he leído siempre tiene el canActivatemétodo que devuelve un valor booleano, pero creo que es necesario para volver ya sea observable o promesa.

Mi aplicación tiene un almacén de datos con una propiedad userque es una Observable<User>.

Cuando las cargas de aplicaciones, es user.role undefined. Después de una solicitud HTTP inicial, el user.role se convierte ya sea usuario o invitados. Por lo tanto, necesito el método canActivate que esperar hasta user.role está ajustado a usuario o invitados, luego responder. Aquí es lo que tengo ahora:

  canActivate(): Observable<boolean> {
    return new Observable((observer: Observer<boolean>): void => {
      this.state.user.subscribe((user: User) => {
        if (user.role === 'user') {
          observer.next(true);
        } else if (user.role === 'guest') {
          observer.next(false);
          this.router.navigate(['/login']);
        }
        // user is not set, wait for next value
      });
    });
  }

El problema es que creo que la suscripción sigue adelante, y mi router es a veces de forma inesperada cuando se actualiza redirigido state.user. Cómo puedo arreglar esto. O, ¿hay una mejor manera de hacer esto?

Publicado el 19/09/2018 a las 13:21
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
0

Se puede probar este pedazo de código

canActivate(): Observable<boolean> {
    return this.state.user.map((user: User) => {
        if (user.role === 'user') {
          return true;
        } else if (user.role === 'guest') {
          this.router.navigate(['/login']);
          return false;
        }
        // user is not set, wait for next value
      });
  }
Respondida el 19/09/2018 a las 13:59
fuente por usuario

votos
0

¿Por qué usted quiere colgar este observable si user.rolees undefined? De esta manera toda enrutador está colgando. Esto puede provocar un comportamiento inesperado como redirecciones no deseados.

Creo que no se debe colgar este canActivate()método, pero volver trueo falselo más rápido posible en el modo asíncrono.

No sé contexto del problema. Si desea asegurarse de que el usuario está autorizado antes de ejecutar la aplicación tal vez un mejor uso APP_INITIALIZER? Este mecanismo se "cuelgue" aplicación entera hasta algunas cosas importantes se hacen y se resuelven Promise.

Respondida el 19/09/2018 a las 13:55
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more