Angular2:如何“重新加载”带路由器的页面(recheck canActivate)? [英] Angular2: how to "reload" page with router (recheck canActivate)?

查看:133
本文介绍了Angular2:如何“重新加载”带路由器的页面(recheck canActivate)?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的路由器有 canActivate:[AuthGuard] 并且验证 AuthGuard

I have routers with canActivate: [ AuthGuard ] and validation inside AuthGuard

如何在同一个路由器URL中强行检查 canActivate

How to force check canActivate in same router url ?

例如:当前路线是 / admin 我有会话过期的事件。我在 AuthGuard 中进行会话检查,但只有在执行 .navigate(...)时才会激活此检查。如何强制在同一位置运行 canActivate

For example: Current route is /admin and I have got event like session expired. I have session check in AuthGuard but this check activates only when I execute .navigate(...). How to force run canActivate in same location?

我试过:这个。 router.navigate([this.router.url]); 但是角度检查相同的位置并且什么都不做。

I've tried: this.router.navigate([ this.router.url ]); but angular checks same location and do nothing.

ps当我收到会话过期事件时,我可以找到登录页面或其他页面,但我在 AuthGuard 我不想在所有其他事件中重复相同的重定向,我需要像 location.reload()但在Angular2路线中。

p.s. I can locate to "login page" or other pages when I got session expired event, but I have all redirects inside AuthGuard and I do not want to repeat the same redirects in all other events, I need just like location.reload() but in Angular2 routes.

主要问题听起来像:如何强制重新运行 canActivate 当前位置的警卫?

Main question sounds like: How to force rerun canActivate guards in current location?

推荐答案

我的临时解决方案:

auth.service.ts

import { Injectable, Injector } from '@angular/core';
import { ActivatedRoute, Router, RouterStateSnapshot } from '@angular/router';

@Injectable()
export class AuthService {

  constructor(private route: ActivatedRoute,
              private router: Router,
              private injector: Injector) {
    this.forceRunAuthGuard();
  }

  // Dirty hack for angular2 routing recheck
  private forceRunAuthGuard() {
    if (this.route.root.children.length) {
      // gets current route
      const curr_route = this.route.root.children[ '0' ];
      // gets first guard class
      const AuthGuard = curr_route.snapshot.routeConfig.canActivate[ '0' ];
      // injects guard
      const authGuard = this.injector.get(AuthGuard);
      // makes custom RouterStateSnapshot object
      const routerStateSnapshot: RouterStateSnapshot = Object.assign({}, curr_route.snapshot, { url: this.router.url });
      // runs canActivate
      authGuard.canActivate(curr_route.snapshot, routerStateSnapshot);
    }
  }

}

app.routes.ts

  { path: 'faq', canActivate: [ AuthGuard ], component: FaqComponent },
  { path: 'about', canActivate: [ AuthGuard ], component: AboutUsComponent },
  { path: 'upgrade', canActivate: [ AuthGuard ], component: UpgradeComponent },

此代码再次运行 AuthGuard

这篇关于Angular2:如何“重新加载”带路由器的页面(recheck canActivate)?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆