2017-09-21 2 views
0

gelöst Ich habe eine Anwendung mit Routen von einem AuthGuard bewacht, die CanActivate implementiert. Kann Prüfungen aktivieren, um festzustellen, ob der Benutzer angemeldet ist, und dann prüfen, ob Konfigurationsvariablen gesetzt sind, bevor Wahr oder Falsch zurückgegeben wird. Wenn der Benutzer angemeldet ist, aber keine Konfigurationsvariablen gesendet wurden, führt AuthGuard einen HTTP-Aufruf zum Abrufen des Konfigurations-Setups aus und gibt true zurück, sobald der HTTP-Aufruf ohne Fehler aufgelöst wurde (andernfalls false).Angular2: Router Ereignis: NavigationAbbrechen vor Route Guard hat

Das Problem ist, dass der Router die Navigation auf die angeforderte Route abbricht, bevor der Konfigurationsanruf gelöst wurde.

Unten ist die AuthGuard canActivate Methode:

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) { 

     let authenticated = this.isAuthenticated(); 

     if (authenticated) { 
      console.log("User authenticated, checking for configs..."); 
      if (this.config.defined) { 
       console.log("Config defined!"); 
       return true; 
      } else { 
       ***** HERE ****** 
       console.log("Config not defined, setting configs..."); 
       this.authService.setConfig() 
        .take(1) 
        .subscribe(
         config => { 
          // SET CONFIG VARIABLES 
          console.log("Config variables set"); 

          // allow route access 
          return true; 
         }, 
         err => { 
          console.error(err); 
          this.router.navigate(['/Login']); 
          return false; 
         } 
        ); 
       this.router.navigate(['/Login']); 
       return false; 
      } 
     } else { 
      console.log("User not authenticated, back to login"); 
      this.router.navigate(['/Login']); 
      return false; 
     } 
    } 

Also, wenn ich angemeldet bin in und die Konfigurationsvariablen gesetzt sind nicht wenn ich versuche, auf eine Seite zuzugreifen (dh ich bin in logischen Block von **** HERE **** bezeichnet) zu sehen, die ich in der Konsole:

Setting config... 

NavigationCancel {id: 1, url: "/", reason: ""} 

NavigationStart {id: 2, url: "/Login"} 

RoutesRecognized {id: 2, url: "/Login", urlAfterRedirects: "/Login", state: RouterStateSnapshot} 

NavigationEnd {id: 2, url: "/Login", urlAfterRedirects: "/Login"} 

Config variables set 

Bevor der AuthGuard Config http Aufruf eine Chance hat, zu lösen, wird die Navigation abgebrochen und der Router leitet, als ob der AuthGuard falsch war zurückgekehrt. Ich möchte einen Weg finden, damit AuthGuard sein Ergebnis bei der Auflösung des http-Aufrufs zurückgibt.

Antwort

-1

Wenn jemand anderes, wenn dieses Problem haben, ich durch den Austausch der Inhalte des else Block (beginnend mit *****HERE******) mit folgendem das Problem gelöst:

return this.authService.setConfig() 
        .map(
        config => { 
         // SET CONFIG VARIABLES 
         console.log("Config variables set"); 

         // allow route access 
         return true; 
        }) 
        .catch(err => { 
         console.error(err); 
         this.router.navigate(['/Login']); 
         return Observable.of(false); 
        }); 
+0

was meinst du mit „**** mit Start **HIER******"? – CodyBugstein