Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 将布尔值从可观察传递到可观察_Angular_Typescript_Firebase_Firebase Authentication_Angularfire2 - Fatal编程技术网

Angular 将布尔值从可观察传递到可观察

Angular 将布尔值从可观察传递到可观察,angular,typescript,firebase,firebase-authentication,angularfire2,Angular,Typescript,Firebase,Firebase Authentication,Angularfire2,我想在我的adminauthguard中检查用户是否设置了adminflag(在Firebase中使用angularfire2) canActivate(路由:ActivatedRouteSnapshot,状态:RouterStateSnashot):可观察的布尔值{ 返回此.loginservice.af.auth.map((auth)=>{ if(auth==null){ 返回false; }否则{ this.membersservice.get(auth.uid).subscribe(用户

我想在我的adminauthguard中检查用户是否设置了adminflag(在Firebase中使用angularfire2)

canActivate(路由:ActivatedRouteSnapshot,状态:RouterStateSnashot):可观察的布尔值{
返回此.loginservice.af.auth.map((auth)=>{
if(auth==null){
返回false;
}否则{
this.membersservice.get(auth.uid).subscribe(用户=>{
如果(users.admin==true){
返回true;
}否则{
返回false;
}
})
}
});
如何解析内部可观察对象中的可观察对象?

canActivate(路由:ActivatedRouteSnapshot,状态:RouterStateSnashot):可观察布尔值{
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);
          }
        })
      }
    });
返回新的可观察对象(观察者=>{ this.loginservice.af.auth.map((auth)=>{ if(auth==null){ 观察者:下一个(假); }否则{ this.membersservice.get(auth.uid).subscribe(用户=>{ 如果(users.admin==true){ 观察者:下一个(正确); }否则{ 观察者:下一个(假); } }) } });
由于我不知道Firebase for Angular2(仅限iOS)的确切情况,因此无法1000%确定这是否适用于您的服务可观察对象,但通过这种方式,您可以创建一个可观察对象,它仅根据闭包内发生的事件发出值


您可能需要确保的唯一一件事是(在测试中)不会运行到未定义的状态,例如,在异步危险中,您都会发出true和false。

在运行任何安全组件之前,我需要等待用户使用信息。我使用与lastWhisper类似的解决方案,实现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();
    }
}
路径:'app',组件:FullLayoutComponent,数据:{title:'Home'},canActivateChild:[CanActivateChildTeam], CanActivateChildTeam服务: 从“@angular/core”导入{Injectable,OnDestroy}; 从“@angular/router”导入{CanActivateChild}”; 从“流星/流星”导入{Meteor}; 从'@angular/Router'导入{Router}; 从“rxjs/Rx”导入{Observable}; 从“meteor rxjs”导入{MeteorObservable}; 从'rxjs/Subscription'导入{Subscription}; @可注射() 导出类CanActivateChildTeam实现CanActivateChild、OnDestroy{ 允许:可观察; private\u userSub:订阅; 构造函数(专用路由器:路由器){ } canActivateChild(路径:任意,状态:任意):可观察的|承诺|布尔{ 返回这个.getUser(); } getUser(){ 如果(这是允许的){ this.allow=新的可观察对象(observer=>{ 观察者:下一个(正确); observer.complete(); }); 归还这个。允许; } if(Meteor.userId()){ this.allow=新的可观察对象(observer=>{ 如果(此._userSub) 这是。_userSub.unsubscribe(); 这个._userSub=MeteorObservable.subscribe('user',Meteor.userId()).subscribe( () => { 观察者:下一个(正确); observer.complete(); } ); }); 归还这个。允许; } 否则{ this.router.navigate(['/']); } } ngOnDestroy():void{ 如果(此._userSub) 这是。_userSub.unsubscribe(); } }
你不能这么做。@RomanC你知道我如何用另一种方法解决这个问题吗?类似于
af.auth.mergeMap(auth=>!auth?Observable.of(false):membersservice.get(…).map(users=>!!users.admin)).subscribe(…)
。我等不及了,所以我现在就尝试了。它不起作用了,后面的编码是。loginservice.af.auth.map((auth)=>从未接触过,我尝试过使用console.log(“我在这里”),但从未从这里得到结果:(this.loginservice.af.auth.map((auth)…)->返回this.loginservice.af.auth.subscribe((auth)可能,除了return…subscribe之外,还应该在每个observer.next之后调用observer.complete()。
    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();
    }
}