web-dev-qa-db-ja.com

監視可能から監視可能にブール値を渡す

ユーザーがadminflagを設定したかどうかをadminauthguardで確認したい(Anglefire2を使用してFirebaseで)

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

オブザーバブルをオブザーバブル内でどのように解決できますか?

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

Angular2のFirebaseは正確にはわからないため(iOSのみ)、これがサービスのObservableで動作するかどうかは1000%わかりませんが、この方法では、クロージャー内で発生しているイベントに基づいて値を出力するだけのObservableを作成します。

(テストで)確認する必要がある唯一のことは、未定義の状態に陥らないことです。あなたが両方とも真と偽を放出する非同期ハザードのようなもの。

15
lastWhisper

安全なコンポーネントを実行する前に、ユーザーサブスクリプション情報を待つ必要があります。最後のWhispersと同様のソリューションを使用して、canActivateChildを実装し、ルートに設定します。

    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();
    }
}
4
Manuel Villena