将布尔值从 observable 传递到 observable
Pass boolean from observable to observable
如果用户设置了 adminflag(在 Firebase 中使用 angularfire2),我想检查我的 adminauthguard
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;
}
})
}
});
如何解析observable里面的observable?
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);
}
})
}
});
不能 1000% 确定这是否适用于您的服务 Observables,因为我不完全了解 Angular2 的 Firebase(仅 iOS),但是通过这种方式您可以创建一个仅根据以下条件发出值的 Observable闭包内发生的事件。
您可能需要确保(通过测试)的唯一一件事是您不会 运行 进入未定义的状态,例如类似于异步危险,你同时发出 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();
}
}
如果用户设置了 adminflag(在 Firebase 中使用 angularfire2),我想检查我的 adminauthguard
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;
}
})
}
});
如何解析observable里面的observable?
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);
}
})
}
});
不能 1000% 确定这是否适用于您的服务 Observables,因为我不完全了解 Angular2 的 Firebase(仅 iOS),但是通过这种方式您可以创建一个仅根据以下条件发出值的 Observable闭包内发生的事件。
您可能需要确保(通过测试)的唯一一件事是您不会 运行 进入未定义的状态,例如类似于异步危险,你同时发出 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();
}
}