Hvordan å returnere observer <boolean> i canActivate på en bevoktet rute i Vinkel 6

stemmer
0

Jeg ønsker å vokte en rute med en CanActivate klasse. Dokumentasjonen jeg har lest har alltid canActivatemetoden returnerer en boolsk verdi, men jeg tror jeg trenger å returnere enten observerbar eller Promise.

Min app har et datalager med en egenskap usersom er en Observable<User>.

Når app laster, er user.role undefined. Etter en initiell http-forespørsel, blir user.role enten bruker eller gjest. Så må jeg canActivate metoden for å vente til user.role er satt til enten bruker eller gjest, og deretter svare. Her er det jeg har nå:

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

Problemet tror jeg er at abonnementet fortsetter å gå, og min router er noen ganger uventet omdirigert når state.user oppdateres. Hvordan kan jeg fikse dette. Eller er det en bedre måte å gjøre dette?

Publisert på 19/09/2018 klokken 13:21
kilden bruker
På andre språk...                            


2 svar

stemmer
0

Kan du prøve denne delen av koden

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
      });
  }
Svarte 19/09/2018 kl. 13:59
kilden bruker

stemmer
0

Hvorfor du ønsker å henge dette observerbar hvis user.roleer undefined? På denne måten hele ruteren henger. Dette kan føre til uventede oppførsel som uønsket viderekoblinger.

Jeg tror du bør ikke henge denne canActivate()metoden, men returnerer trueeller falseså fort som mulig i asynkron måte.

Jeg vet ikke sammenheng med problemet. Hvis du vil være sikker på brukeren er autorisert før du kjører programmet kanskje bedre å bruke APP_INITIALIZER? Denne mekanismen vil "henge" hele programmet til noen viktige ting blir gjort og løse Promise.

Svarte 19/09/2018 kl. 13:55
kilden bruker

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