Angulaire 2 - Routage - CanActivate travailler avec Observables
J'ai un AuthGuard (utilisé pour le routage) qui implémente CanActivate.
canActivate() {
return this.loginService.isLoggedIn();
}
Mon problème, c'est que le CanActivate-résultat dépend d'un http-get-résultat - le LoginService retourne un Observables.
isLoggedIn():Observable<boolean> {
return this.http.get(ApiResources.LOGON).map(response => response.ok);
}
Comment puis-je apporter à ceux - faites CanActivate dépendent d'un backend de l'état?
- Avez-vous lu ici? angular.io/docs/ts/latest/guide/router.html recherche de la Route des Gardes, Ici est la référence de l'api pour CanActivate: angulaire.io/docs/ts/latest/api/routeur/index/... comme vous le voyez, il peut retourner les booléens ou Observables<boolean>
canActivate()
peut retourner unObservable
, assurez-vous que leObservable
a terminé (c'est à dire.observer.complete()
).- que faire si l'observable émet plus de valeurs et réalise alors? Quel est le garde de le faire? Ce que j'ai vu jusqu'à présent est l'utilisation de
take(1)
Rx de l'opérateur à réaliser la completnes de flux, Que faire si j'ai oublié de l'ajouter?
Vous devez vous connecter pour publier un commentaire.
Vous devez mettre à niveau "@angulaire/routeur" à la dernière . par exemple,"3.0.0-alpha.8"
modifier AuthGuard.ts
Si vous avez des questions, posez-les moi!
isLoggedIn()
est unPromise
, vous pouvez le faireisLoggedIn().then((e) => { if (e) { return true; } }).catch(() => { return false; });
j'espère que cela aide les futurs voyageurs!import 'rxjs/add/observable/of';
import { Observable, of } from 'rxjs';
La mise à jour de Kery Hu réponse Angulaire 5 et RxJS 5.5 où
catch
opérateur est obsolète. Vous devez maintenant utiliser la catchError opérateur en conjonction avec tuyau et locative opérateurs.canActivate() accepte
Observable<boolean>
comme valeur de retour. Le garde va attendre le Observables pour résoudre et regardez la valeur. Si le "vrai" il va passer de la case, sinon ( toutes les autres données ou jetés erreur ) rejettera la route.Vous pouvez utiliser le
.map
opérateur de transformer leObservable<Response>
àObservable<boolean>
comme suit:Je l'ai fait de cette façon:
Comme vous pouvez le voir je suis de l'envoi d'un repli de la fonction de userService.auth que faire si http échec de l'appel.
Et dans userService j'ai:
Cela peut vous aider à
Comment cela fonctionne pour vous, sans faire appel à vous abonner?
pour moi quand je l'appelle par mon .net API rien est de retour. J'ai appeler abonnez-vous sur mon auth service de garde comme ce alors seulement il rend réel les appels de l'API.
Mais depuis abonnez-vous est asynchrone mon canActivate garde ne fonctionne pas et l'utilisateur peut entrer dans la page.
CanActivate fonctionne avec Observables, mais qui échoue lorsque les 2 appels sont effectués comme CanActivate:[Guard1, Guard2].
Ici, si vous retournez un Observables de faux, d'Guard1 puis aussi, il va vérifier dans Guard2 et de permettre l'accès à la route si Guard2 renvoie la valeur true.
Afin d'éviter que, Guard1 doit retourner un booléen au lieu d'Observables de type boolean.
dans canActivate(), vous pouvez retourner un local de la propriété boolean (false par défaut dans votre cas).
Et puis, dans la suite de l'LoginService, vous pouvez modifier la valeur de la propriété.