5

Chcę sprawdzić w moim adminauthguard jeśli użytkownik ustalił adminflag (w Firebase użyciu angularfire2)Przełęcz logiczna z obserwowalne do zaobserwowania

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot):Observable<boolean> | boolean { 
    return this.loginservice.af.auth.map((auth) => { 
     if(auth == null) { 
     return false; 
     } else { 
     this.membersservice.get(auth.uid).subscribe(users => { 
      if(users.admin == true) { 
      return true; 
      } else { 
      return false; 
      } 
     }) 
     } 
    }); 

jak mogę rozwiązać obserwowalny w obserwowalne w środku?

+0

Nie możesz tego zrobić. –

+0

@RomanC każdy pomysł, jak mogę to rozwiązać w inny sposób? –

+0

Coś jak 'af.auth.mergeMap (auth =>! Auth? Observable.of (false): membersservice.get (...). Map (users => !! users.admin)). Subscribe (...) '. – estus

Odpowiedz

10
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot):Observable<boolean> | boolean { 

return new Observable<boolean>(observer => { 

    this.loginservice.af.auth.map((auth) => { 
     if(auth == null) { 
     observer.next(false); 
     } else { 
     this.membersservice.get(auth.uid).subscribe(users => { 
      if(users.admin == true) { 
      observer.next(true); 
      } else { 
      observer.next(false); 
      } 
     }) 
     } 
    }); 

nie 1000% pewien, czy to będzie działać ze swoimi obserwable usług, ponieważ nie wiem Firebase dla Angular2 dokładnie (tylko iOS), ale w ten sposób utworzyć zauważalny że właśnie emituje wartości na podstawie zdarzeń które dzieje się wewnątrz zamknięcia.

Jedyne, co możesz zrobić, aby upewnić się (z testami), że nie natrafisz na niezdefiniowane stany, np. coś takiego jak asynchroniczne zagrożenia, w których obaj emitujesz prawdziwe i fałszywe.

+0

Nie mogę się doczekać, więc próbowałem go teraz ... nie działa, kodowanie po tym .loginservice.af.auth.map ((auth) => nigdy nie został dotknięty, próbowałem z console.log ("TUTAJ I AM "), ale nigdy nie uzyskaj wyniku stąd :( –

+0

this.loginservice.af.auth.map ((auth) ... -> return this.loginservice.af.auth.subscribe ((auth) – gerleim

+0

Prawdopodobnie oprócz zwrotu ... subskrybuj, obserwator.complete() powinien być wywołany po każdym obserwatorze. – gerleim

2

Potrzebuję czekać Informacje o użytkowniku użytkownika przed uruchomieniem jakiegokolwiek bezpiecznego składnika. Używam podobnego rozwiązania do lastWhisper's, implementując canActivateChild i ustawiając w trasach:

path: 'app', component: FullLayoutComponent, data: {title: 'Home'}, canActivateChild: [CanActivateChildTeam], 

CanActivateChildTeam Service: 

    import {Injectable, OnDestroy} from "@angular/core"; 
    import {CanActivateChild} from "@angular/router"; 
    import {Meteor} from 'meteor/meteor'; 
    import {Router} from '@angular/router'; 
    import {Observable} from "rxjs/Rx"; 
    import {MeteorObservable} from 'meteor-rxjs'; 
    import {Subscription} from 'rxjs/Subscription'; 


    @Injectable() 
    export class CanActivateChildTeam implements CanActivateChild, OnDestroy { 

    allow:Observable<boolean>; 
    private _userSub:Subscription; 

    constructor(private router:Router) { 
    } 

    canActivateChild(route:any, state:any):Observable<boolean> | Promise<boolean> | boolean { 
     return this.getUser(); 
    } 

    getUser() { 
     if (this.allow) { 
      this.allow = new Observable(observer => { 
       observer.next(true); 
       observer.complete(); 
      }); 
      return this.allow; 
     } 
     if (Meteor.userId()) { 
      this.allow = new Observable(observer => { 
       if (this._userSub) 
        this._userSub.unsubscribe(); 
       this._userSub = MeteorObservable.subscribe('user', Meteor.userId()).subscribe(
        () => { 
         observer.next(true); 
         observer.complete(); 
        } 
       ); 
      }); 
      return this.allow; 
     } 
     else { 
      this.router.navigate(['/']); 
     } 
    } 

    ngOnDestroy():void { 
     if (this._userSub) 
      this._userSub.unsubscribe(); 
    } 
} 
Powiązane problemy