Comment revenir Observable <booléen> dans canActivate sur une route gardée dans angulaire 6

voix
0

Je voudrais garder une route avec une classe de CanActivate. La documentation que j'ai lu a toujours la canActivateméthode retournant une valeur booléenne, mais je pense que je dois retourner soit Observable ou promesse.

Mon application a un magasin de données avec une propriété userqui est un Observable<User>.

Lorsque les charges d'applications, user.role est undefined. Après une première demande http, le user.role devient soit « utilisateur » ou « invité ». Donc, j'ai besoin la méthode canActivate attendre user.role est réglé sur « utilisateur » ou « invité », répondent alors. Voici ce que j'ai maintenant:

  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
      });
    });
  }

Le problème que je pense est que l'abonnement continue à aller, et mon routeur est parfois de façon inattendue réaiguillé state.user est mis à jour. Comment puis-je réparer cela. Ou, est-il une meilleure façon de le faire?

Créé 19/09/2018 à 13:21
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
0

Pouvez-vous essayer ce morceau de code

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
      });
  }
Créé 19/09/2018 à 13:59
source utilisateur

voix
0

Pourquoi vous voulez accrocher cette observable si user.roleest undefined? De cette façon routeur tout est suspendu. Cela peut entraîner un comportement inattendu comme indésirables réoriente.

Je pense que vous ne devriez pas accrocher cette canActivate()méthode , mais revenir trueou falseaussi vite que possible de manière asynchrone.

Je ne sais pas contexte du problème. Si vous voulez faire l' utilisateur que est autorisé avant d' exécuter l'application utiliser peut - être mieux APP_INITIALIZER? Ce mécanisme « suspendre » l' application jusqu'à ce que l' ensemble des choses importantes sont faites et résoudre Promise.

Créé 19/09/2018 à 13:55
source utilisateur

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