在 Angular 2+ 中路由到延迟加载模块中的特定页面

2023-12-22

我的主应用程序路由器中有以下内容:

{ path: 'users', loadChildren: 'app/modules/users/users.module#UsersModule', canLoad: [AuthGuard] }

当用户转到http://localhost:4200/用户/1234 http://localhost:4200/users/1234为了查看他们的个人资料,我尝试保存完整的网址(包括上面的用户 ID),以便在他们登录后我可以路由回该页面。

问题是,Route中的参数canLoad函数只有一个path不包含上面的用户 ID 的字段,仅包含路径users。有什么方法可以实现这个目标吗?

第一条评论后编辑

用户路由模块确实有一个canActivate守卫,但是除了登录组件之外,永远不会调用它,因为从第一个canLoad返回 false 并将调用者路由到先前的登录组件。

第一个答案后编辑

canLoad(route: Route) {
  if (!AuthService.isAuthenticated()) {
    this.router.events.takeWhile(event => !(event instanceof NavigationCancel))
      .subscribe(event => {
        console.log(event);
        if (event instanceof NavigationCancel) {
          AuthService.setRedirectUrl(event.url);
        }
      });
    return false;
  }
  return true;
}

所以我尝试了上述方法,但我认为我仍然做错了什么,因为控制台从不记录......我如何取消订阅或停止接收NavigationCancel设置存储重定向 URL 后的事件?


Since canLoad在构建路由器状态期间被调用,它不会获得激活的路由和整个路由器状态。它仅获取路线。

您可以将路由器注入守卫,订阅导航取消 https://github.com/angular/angular/blob/4.0.0/packages/router/src/events.ts#L53您可以访问 URL 的事件。

我如何取消订阅或停止接收 NavigationCancel 事件 设置存储重定向 URL?

Since router.events 是一个主题 https://github.com/angular/angular/blob/4.0.0/packages/router/src/router.ts#L222,您可以像这样取消订阅:

// get the subscription reference
const subscription = this.router.events.takeWhile(event => !(event instanceof NavigationCancel))
      .subscribe(event => {
        console.log(event);
        if (event instanceof NavigationCancel) {
          AuthService.setRedirectUrl(event.url);
          // use it to unsubscribe
          subscription.unsubscribe(); <----------------------------
        }
      });
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Angular 2+ 中路由到延迟加载模块中的特定页面 的相关文章

随机推荐

  • 应用程序缓存清单+本地存储大小限制

    我正在构建一个可能有大量离线存储需求的应用程序 我想知道是否可以同时使用离线缓存清单 5MB 和本地存储 5MB 来使用 10MB 存储 请注意 这是一个 Intranet 应用程序 因此我们可以控制设备 我已经在 Chrome Firef
  • 没有模糊视图效果的 UIAlertController 操作表

    我在用着UIAlertController对于一些行动 但我不太喜欢模糊视图效果在操作组视图中 参见下面的屏幕截图 我正在尝试消除这种模糊效果 我在网上查了一下 没有找到任何APIUIAlertController这样就可以消除这种模糊效果
  • php + mysql,按名称排序+从特定id开始

    MySQL id name 1 Joe 2 Craig 3 Shawn 4 Ryan 5 Seth PHP a mysql query SELECT FROM table name ORDER BY name DESC 但我想做的是 我想从
  • Firebird 交易计数超出

    我们有一个运行 Firebird 数据库的实现 但出现以下错误 超出实施限制 超出交易计数 执行备份和恢复以使数据库再次可操作 我们知道如何通过使数据库只读 执行备份和恢复以及再次读写来解决此问题 但是我们不太确定导致此问题的原因 我感觉交
  • > 和线程' aria-label='Rust 生命周期与 mpsc::Sender> 和线程'> Rust 生命周期与 mpsc::Sender> 和线程

    我正在创建一个多线程应用程序 在其中创建一个接收通道和一个用于保存发送通道的结构 稍后由实现使用 但是 我通过通道发送的类型具有生命周期规范 这种类型是websocket message Message来自 rust websocket 库
  • 如何在 zenframework 2 上配置学说命令行工具

    我在 zendframework 2 上使用原则 2 我已经正确配置了两者 并且它们都正常工作 不过我想用学说的命令行工具生成实体等 我遵循了学说的说明 并在应用程序的根目录中创建了一个 cli config php 页面 http doc
  • 如何防止 DIV 扩展并占据所有可用宽度?

    在下面的 HTML 中 我希望图像周围的框架能够紧贴 不要拉伸并占据父容器中的所有可用宽度 我知道有几种方法可以做到这一点 包括可怕的事情 例如手动将其宽度设置为特定数量的像素 但是什么是right way Edit 一个答案建议我关闭 d
  • ARRAY_CONTAINS hive 中的多个值

    有没有一种方便的方法来使用 hive 中的 ARRAY CONTAINS 函数来搜索数组列中的多个条目 而不仅仅是一个 所以而不是 WHERE ARRAY CONTAINS array val1 OR ARRAY CONTAINS arra
  • 如何在ios中调整uilabel的角度[重复]

    这个问题在这里已经有答案了 i m creating an iphone app in that application i want to angle the label according to the attached screen
  • iOS 8 CoreData 问题:recordChangeSnapshot:forObjectID:: 录制时全局 ID 可能不是临时的

    我正在将我的应用程序从 iOS 7 迁移到 iOS 8 当我尝试保存核心数据上下文时 我在 Xcode 中收到以下错误 iOS 7 和 Xcode 5 中不存在此错误 它会在下面的行中抛出异常 NSError saveError nil i
  • Django:“sys.path”应该是什么?

    开发 Django 应用程序时 什么是sys path应该包含 包含项目的目录 或项目的目录 或两者 sys path应该并且将会有项目的目录 根据您的设置 它还可能包含包含项目的目录 但是 如果这个问题背后的动机是确保可以找到某些文件 那
  • 如何在Windows批处理文件中循环连接字符串?

    我熟悉 Unix shell 脚本编写 但对 Windows 脚本编写不熟悉 我有一个包含 str1 str2 str3 str10 的字符串列表 我想这样做 for string in string list do var string
  • 调用未定义的方法 Maatwebsite\Excel\Excel::load()

    我正在尝试使用 maatwebsite 3 0 导入 Excel 文件 xlsx 如何修复此错误 调用未定义的方法 Maatwebsite Excel Excel load 我的控制器 public function importsave
  • CGMutablePathRef 的自动释放?

    我正在为 iPhone 开发 我想通过 CGPathCreateMutable 创建一个可变路径 并且我想从创建它的函数中返回它 我应该在完成后调用 CGPathRelease 但既然我要归还它 我希望自动释放它 由于 Quartz 路径是
  • 如何使用MockBloc实现widget测试?

    我正在尝试实现小部件测试以测试登录表单 该测试取决于我使用 MockBloc 嘲笑的块 但是 它会引发以下错误 EXCEPTION CAUGHT BY FLUTTER TEST FRAMEWORK The following StateEr
  • 使用 odeint 求解 ODE 时如何传递源项

    强迫谐振子的微分方程为Mx Lx w 2 x F t 这里 F t 是源项 为了解决这个问题 我编写了一段代码 在函数 diff 中定义微分方程 我编写了另一个函数 generate pulse 来给出 F t 然后我使用 odeint 它
  • AngularJS 中的控制器功能?

    我是角度js新手 控制器在我的代码中无法正常工作 我正在尝试运行以下代码 name br div div
  • Haskell 中的高效比特流

    在不断努力有效地摆弄位的过程中 例如 请参阅此所以问题 https stackoverflow com questions 43601927 efficient bit fiddling in a lfsr implementation 最
  • 通过PHP邮件发送邮件速度慢

    我有一个拥有超过 100 万成员的大型董事会 并且在向每个成员发送电子邮件之间存在很大的延迟 按照目前的速度 我实际上需要 3 个月的时间才能向所有 100 万会员发送电子邮件 我的机器 专用 双四核至强 32G 公羊 森托斯 5 4 v公
  • 在 Angular 2+ 中路由到延迟加载模块中的特定页面

    我的主应用程序路由器中有以下内容 path users loadChildren app modules users users module UsersModule canLoad AuthGuard 当用户转到http localhos