J'essaie de renvoyer un observable quand je reçois une certaine valeur chez un abonné, mais j'échoue lamentablement.
C'est le code:
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot):Observable<boolean> {
// get route to be activated
this.routeToActivate = route.routeConfig.path;
// get user access levels
return this._firebase.isUserAdmin <-- returns Subscription, not Observable
.map(user => user.access_level)
.subscribe( access => {
// I need to return an observable here
});
}
Il n’ya pas beaucoup de ressources sur les observables dans angular 2, donc je ne sais pas par où commencer. Quelqu'un peut-il aider avec cela s'il vous plaît?
UPDATE -> Version de travail
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot):Observable<boolean> {
// get route to be activated
this.routeToActivate = route.routeConfig.path;
// get user access levels
return this._firebase.isUserAdmin
.map(user => {
let accessLevel = user.access_level;
if (accessLevel === 'admin' ) {
return true;
}
}).first();
}
Vous ne pouvez pas retourner un observable de subscribe, mais si vous utilisez map
au lieu de subscribe
, un Observable
est renvoyé.
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot):Observable<boolean> {
// get route to be activated
this.routeToActivate = route.routeConfig.path;
// get user access levels
return this._firebase.isUserAdminObservable
.map(user => {
// do something here
// user.access_level;
return true;
})
.first(); // for the observable to complete on the first event (usually required for `canActivate`)
// first needs to be imported like `map`, ...
}
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot):Observable<boolean> {
// get route to be activated
this.routeToActivate = route.routeConfig.path;
let subject = new Subject();
// get user access levels
this._firebase.isUserAdminObservable
.map(user => {
let accessLevel = user.access_level;
if (accessLevel === 'admin' ) {
subject.emit(true);
subject.complete();
}
return user;
});
return subject;
}
Nous pouvons convertir l'objet Observable en promesse en utilisant la méthode toPromise
. Afin que le code puisse être implémenté de la manière suivante:
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot):Promise<boolean> {
// get route to be activated
this.routeToActivate = route.routeConfig.path;
// get user access levels
return this._firebase.isUserAdmin
.map(user => {
return (user.access_level === 'admin');
}).toPromise();
}
Vous n'avez pas besoin de carte, le code ci-dessous spécifie d'abord un prédicat et une fonction de projection.
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot):Observable<boolean> {
this.routeToActivate = route.routeConfig.path;
return this._firebase.isUserAdminObservable
.first((_, index) => index === 0, user => {
// do something here
// user.access_level;
return true;
})
}