路由器:从canActivate方法返回的承诺中进行重定向
Router: Redirect from within a promise returned by a `canActivate` method
我有几个方法来访问我的服务器。所有这些方法都没有返回承诺或可观察对象,我在传递回调。
现在我需要写一个保护,以确保在用户可以使用多个路由之前已经加载了用户数据。canActivate
方法返回一个promise,但是有代码在promise中导航,这不起作用。
有人知道如何解决这个问题吗?我必须重写我的api方法来返回承诺或可观察对象吗?或者有一种方法,使重定向从一个承诺,这是返回我的canActivate
。将代码移到resolve对象中获取用户数据(如果用户已登录)会更好吗?
import {Injectable} from '@angular/core';
import {CanActivate, Router, ActivatedRouteSnapshot, RouterStateSnapshot} from '@angular/router';
import {GlobalStateService} from './globalState.service';
import {AuthTokenService} from './authToken.service';
import {UserApi} from '../api/user.api';
@Injectable()
export class AfterLogInGuardService implements CanActivate {
constructor(
private globalState: GlobalStateService,
private authToken: AuthTokenService,
private router: Router,
private userApi: UserApi
) { }
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean|Promise<boolean> {
// The tho user is not logged in, redirect her always to the login page, if
// she calls routes with this guard.
if (!this.authToken.has()) {
this.router.navigateByUrl('/logIn');
return false;
}
const thisGuard = this;
// If the user has a token, we have to ensure, that we have the user data
// loaded from the server.
return this.afterUserDataHasBeenLoaded(function () {
// Redirect the user to the "Please enter your personal data" page, if
// she has not entered them yet.
if (!thisGuard.globalState.personalDataStored && route.url.toString() !== 'signUp,personalData') {
//
// This here doesn't work!
//
thisGuard.router.navigateByUrl('/signUp/personalData');
return false;
}
return true;
});
};
private afterUserDataHasBeenLoaded(callback: () => boolean) {
const thisGuard = this;
return new Promise<boolean>(function(resolve, reject) {
if (thisGuard.globalState.userDataLoaded)
return callback();
const innerCallback = function () {
thisGuard.globalState.userDataLoaded = true;
resolve(callback());
};
thisGuard.userApi.getUserData(innerCallback);
});
}
}
以下实现可能是有用的。承诺在auth.service
中定义auth.guard
import { Injectable } from '@angular/core';
import { Router, CanActivate } from '@angular/router';
import { AuthService} from './services/auth.service';
@Injectable()
export class AuthGuard implements CanActivate {
status:boolean=false;
constructor(private authService:AuthService, private router:Router) { }
canActivate() {
var self=this;
this.authService.isAuth()
.then((res)=>{if(res==true)return true;else self.router.navigate(['/login']);});
}
}
auth.service
isAuth(): Promise<Status> {
const url = "/account/check";
return this.http.get(url)
.toPromise()
.then(response=>return response.json().status as Status)
.catch(this.handleError);
}
服务器响应
{_body: "{"status":false}", status: 200, ok: true, statusText: " ok ",标题:标题…}
相关文章:
- 通过javascript重定向html传递php变量
- JavaScript下拉菜单-点击按钮并根据所选值重定向到url
- 使用angular重定向到html页面
- 如何在chrome扩展中重定向到html页面
- 无法从jquery Mobile导航栏重定向到另一个页面
- ng视图外的链接重定向到ng视图内的页面
- 在phonegap应用程序内部重定向不起作用
- CORS-重定向到第二个GET正在接收的页面
- AJAX不会在文件上传后重定向到网页-POST方法
- 重定向时角度刷新浏览器
- 通过链接重定向不;我不在jstree中工作
- 根据select选项元素将表单重定向到不同的URL
- 通过JQuery重定向到另一个页面
- 重定向到“父窗口”
- 重定向iFrame中的父URL
- PHP-如何重定向到同一页面并更改DOM's
- chrome.tabs.update() 重定向到 'chrome-extension://invalid/'
- AngularJS决心承诺.如果承诺被拒绝,则重定向
- 路由器:从canActivate方法返回的承诺中进行重定向
- Javascript -在承诺后重定向