Angular 将布尔值从可观察传递到可观察
我想在我的adminauthguard中检查用户是否设置了adminflag(在Firebase中使用angularfire2)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(用户
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();
}
}