问题标签 [angular-router-guards]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
23663 浏览

angular - 如何优雅地从 ActivatedRouteSnapshot 中获取完整的 url?

在我的一些 Angular 路由保护中,我想设置“下一个”路径,以便在成功登录后重定向到。

所以,普通的保护canActivate函数签名是这样的:

参数是的route一个实例ActivatedRouteSnapshot

以前为了获取“下一个”URL,我只是从route.url. 只要没有子路线,这一切都很好。

我的示例 URL 是/search/advanced?query_hash=1221d3b57f5616ee16ce70fdc78907ab,其中advanced的子路由是search.

子路由可以在 中找到route.children,但是遍历这些子路由(特别是可能有多个级别)并以这种方式组合 URL 看起来既尴尬又丑陋。

我感兴趣的是包含在route._routerState.url属性中(作为字符串,在下图的底部),但它是一个“私有”变量。

我错过了什么吗?如何优雅地从ActivatedRouteSnapshot? 角度版本是 5.1。

在此处输入图像描述

0 投票
4 回答
9023 浏览

angular5 - Angular 5/6:保护路由(路由保护)而不重定向到错误路由

我有点咸菜。我正在使用路由保护(实现CanActivate接口)来检查用户是否被授予访问特定路由的权限:

现在它可以很好地保护“/protected/foo”路由不被激活,但我想告诉用户他试图访问的路由是被禁止的(类似于你可能从服务器获得的 403 Forbidden)。

问题: 如何在不将他重定向到错误路线的情况下向用户显示这个特殊的错误视图,而我发现的这么多来源似乎是首选选项? 以及如何在不实际加载禁止路线的情况下使用我RouteGuard的路线,因为如果我检查我的内部访问FooViewComponent并显示不同的视图,它RouteGuard首先会失败。

理想情况下,我希望我RouteGuard不仅在canActivate()方法中返回 false,而且还希望用 say 完全替换组件ErrorForbiddenViewComponent。但我不知道该怎么做,或者是否有可能。有什么选择吗?

这就是我的路由守卫现在的样子:

所以我只是阻止路由加载,但我没有重定向。我只将未登录的访问者重定向到登录路线。

推理:

  • 路由应该反映应用程序的某些状态 - 访问路由 url 应该重新创建该状态
  • 拥有错误路由(404 Not Found 除外)意味着您的应用程序实际上可以重新创建错误状态。这没有任何意义,因为您为什么要将错误状态保留为应用程序的状态?出于调试目的,应该使用日志(控制台或服务器),重新访问错误页面(即页面刷新)可能会干扰这一点。
  • 此外,通过重定向到错误路由应用程序应该为用户提供一些错误见解。就此而言,要么需要通过 url 传递某些参数,要么(更糟糕的是)在某些错误服务中保持错误状态并在访问错误路由时检索它。
  • 此外,忽略 RouteGuard 并仅加载组件并检查其中的访问权限可能会导致加载一些额外的依赖项,这些依赖项无论如何都不会被使用(因为不允许用户使用),这会使整个延迟加载变得更加困难。

有没有人对此有某种解决方案?我也想知道,在 Angular 2+ 出现这么久之后,为什么以前没有人遇到过这种情况?每个人都可以重定向吗?

还要记住,虽然我目前正在使用FooViewComponent同步,但将来可能会改变!

0 投票
1 回答
6651 浏览

angular - Angular 5:有条件地设置默认路由

我有一个带有三个子菜单及其相应子路线的导航。现在某些子菜单不可见 (ngIf),这取决于用户从服务器获得的声明。

点击主菜单,我重定向到其中一个子菜单,但有时无法访问此子菜单 - 然后我想重定向到下一个兄弟:

现在我可以计算出“有时”。我尝试使用空路径 ('') 和CanActivate-Guard 创建三个路由。与此类似:

希望我可以使用路由和我的规则返回false,例如submenu1是不可见的并且路由器会选择下一个可能的路由(重定向到submenu2)。

我的方法的问题是它redirectTo甚至在我的canActivate-method 被调用之前就被执行了。

最好的方法是什么?

0 投票
2 回答
12132 浏览

angular - 如果用户登录,角度重定向到仪表板

我正在使用 Angular v6,如果用户未登录,我已经实现了从仪表板到登录页面的重定向。
我对这两个选项感到困惑:

  1. 添加登录保护文件以检查登录状态并重定向到仪表板
  2. 检测路由更改事件,在此处检查登录状态并重定向

这种情况下更好的解决方案是什么?

0 投票
2 回答
693 浏览

angular - 角度 - 当用户离开一页(一个组件)时显示警报

预期行为

我有一个包含一个表单的页面,当用户想要离开这个页面时,实际上它只是一个组件,我想显示一些警报,比如“你真的要离开这个页面吗?你的更改将不会被保存”。

当前行为

我努力了

但是对话没有出现。

任何想法或建议都将受到欢迎。

0 投票
2 回答
4159 浏览

angular - TypeError:无法读取 null 的属性“canDeactivate”

我正在尝试使用 canDeactivate 路由器防护。我传入的组件 (ClaimsViewComponent) 在代码第一次运行时为空。但在随后的运行中,代码按预期运行。我们试图弄清楚为什么组件在第一次运行时为空。

这是 canDeactivate 保护代码:

这是路由模块代码:

这是完整的错误堆栈:

谢谢你。

0 投票
1 回答
426 浏览

angular - 如何从 AngularFirestore 获得一个可观察的回报并解决我的路由器守卫

问题:我如何调用 firestore 并使用从 firestore 返回的有效负载解决我的路由器守卫?

问题:我的路由解析保护没有得到解决,即使来自 firestore 的值被返回并被定义。

一切正常,但已完成解决。如果我只返回 true,则解析按预期工作。

0 投票
0 回答
83 浏览

angular - 运行时基于 canLoad 加载模块

语境

我有一个基本的管理页面,它有两个实现,具体取决于服务器中的参数。

这是我用于路由器的配置:

PluginGuard是一个简单的守卫,它调用服务器来检查名为 plugin 的字段的值。

按照设计,这两个路由不能同时加载,因为插件在给定时间只能有一个值。

问题

问题是只考虑了第一个条目,这意味着当 plugin 具有 value 时foo,我可以加载模块ProjectsAModule但是当它具有 value 时barProjectsBModule根本不加载,也没有错误消息。

我的猜测是,这是因为两条路线根本不可能有相同的路径,但是我们有办法正确实现这种行为吗?正确地说,我的意思是不在*ngIf容器组件中使用 a 来根据插件的值显示一个组件或另一个组件。

0 投票
2 回答
5035 浏览

angular - 为什么 CanDeactivate Guard 无法读取我的组件中的方法?

我正在懒惰地加载我的路线。我正在尝试CanDeactivate按照文档使用,但似乎警卫无法读取组件的属性或方法。

这是我的守护

isChangesSaved()是组件内部的一个方法。

这是错误,

错误错误:未捕获(承诺中):TypeError:无法读取 null 的属性“isChangesSaved” TypeError:无法在 CanDeactivateGuard.push../src/app/core/database/database-cores/registry- 读取属性“isChangesSaved”的 null core/guards/patient-registration.guard.ts.CanDeactivateGuard.canDeactivate

这是我的模块(延迟加载)

这是我的路由模块

这是接口的错误还是错误的实现?

更新

我厌倦了将守卫添加到延迟加载模块。RegistryModule这是上面提到的子模块的父模块,

0 投票
1 回答
536 浏览

angular - 配置路由保护

我有一个需要配置的路由保护。在某些路线上,我们想检查我们user client是否准备好,在其他一些路线上,我们想检查我们team client是否准备好等等。

我的路线守卫看起来像这样

从这个守卫我想有多个守卫:一个保护clientName“所有用户”,一个保护“用户”,一个保护“团队”,等等。

具有 :

为此,我尝试了注入令牌,但没有成功;( NullInjectorError: No provider for InjectionToken router token!)。