Angular 4可以激活嵌套的observable不起作用

时间:2017-07-13 21:00:40

标签: angular rxjs observable angular2-services

首先对不起标题,我不知道该怎么称呼它。

我正在开发一个项目,需要一个我最初工作得很好的身份验证防护。基本上它所做的就是检查本地存储中是否存在有效令牌。很简单。

正如大多数应用程序所做的那样,它需要在用户配置文件上设置“重置密码”标志,这会迫使他们在下次登录时重置密码,这样会有点复杂。这就是警卫停止按预期工作的地方。我认为# with with(evaluate(a), b + c + d) [1] 18 # unlist the unnamed output object sum(unlist(evaluate(a))) [1] 18 # subset a named output object result <- evaluate(a) result$b + result$c + result$d [1] 18 # subset an unnamed output object evaluate(a)$b + evaluate(a)$c + evaluate(a)$d [1] 18 # custom function with fancy arguments f <- function(...) { args <- unlist(...) sum(args) } f(evaluate(a)) [1] 18 并没有完全构成链,因为当守卫运行控制台日志result[["b"]] + result[["c"]] + result[["d"]] [1] 18 时,却无法让用户继续。我对RxJs不太熟悉,知道需要做什么。我也提前为可观察到的厄运金字塔道歉。重构这是“很棒的事情”列表。

return Observable.of(true)

任何建议都会非常感谢...谢谢

1 个答案:

答案 0 :(得分:2)

我最终搞清楚了。我开始将大多数观察者合并为一个电话。我还有一个嵌套的observable。但我也发现你必须注意你的回归类型。在switchMap中我返回Observables,但是在嵌套的map操作中它会切换到boolean。

@Injectable()
export class AuthenticationGuard implements OnInit, CanActivate {

	systemSetting$: Observable<any> = this._SystemSettingsService.getSystemSetting('AUTHENTICATION');
	localUserObject$: Observable<LocalUserObject> = this._LocalUserService.getLocalUserObject();

	initialData = Observable.zip(
		this.systemSetting$,
		this.localUserObject$
	);

	constructor(
		private _Router: Router,
		private _LocalUserService: LocalUserService,
		private _SystemSettingsService: SystemSettingsService,
		private _UsersService: UsersService
	) { }

	ngOnInit() {
	}

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

		return this.initialData.switchMap(_Result => {

			// Check for Authentication to be Enabled
			if (_Result[0].data.settingValue.enabled) {

				// Check if Local User Object is Empty and if a Token is Present
				if (_Result[1] && _Result[1].token) {

					return this._UsersService.getUser(_Result[1].userID)
						.map(_User => {
							// If password reset is enabled, force user to reset their password.
							if (_User.data.userPasswordReset) {
								this._Router.navigate(['/gateway/password-reset']);
								return false;

								// If password reset is false, allow the user to proceed.
							} else {
								console.log('PASSWORD RESET, PROCEED');
								return true;
							}
						})

					// If Local User Object is invalid, navigate to Login Page.
				} else {
					// not logged in so redirect to login page with the return url
					this._Router.navigate(['/gateway/login'], { queryParams: { returnUrl: state.url } });
					return Observable.of(false);
				}

				// If Authentication is disabled allow the user to bypass authentication
			} else {
				return Observable.of(true);
			}
		})
	}
}