- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有:
我想用无法激活的 routerLinks 隐藏链接。
有什么好的方法可以隐藏无法激活的 routerLink 吗?
现在你会说做一些像“分享 canActivate 逻辑”这样的事情:
<a [hidden]="callThatCanActivateLogic()" [routerLink]="['/brand']"
问题是这个 canActivateLogic 依赖于组件和权限,这将被错误地设计为以下内容,因为组件解析应该委托(delegate)给路由,而不是嵌入到链接中:
<a [hidden]="callThatCanActivateLogic(TheComponentAtTheEndTargettedByTheRoute, IAmInThatContext)" [routerLink]="['/brand']"
如果有一个解决方案可以在 routerLink 和它的路由 canActivate 之间提供链接,那就太幸运了:)
最佳答案
今天我遇到了同样的问题。不幸的是,我没有找到任何好的解决方案,所以我不得不自己创建一个。
想法是创建一个指令,它将路由器路径作为参数,如果不允许转换则隐藏链接。例如:
<li [allowTransition]="'list'">
<a routerLink="list">List</a>
</li>
指令的逻辑如下:
1) 导入所有路由器的配置,并从属性中找到具有输入路径的配置。我的配置如下:
{ path: 'login', component: LoginComponent },
{ path: 'list', component: ListComponent, canActivate: [UserGuardService]},
2)然后指令读取配置的canActivate属性,通过注入(inject)器获取UserGuardService。通过这种方式,指令采用 UserGuardService 的实例。 UserGuardService 是实现 CanActivate 接口(interface)的类。
3)UserGuardService 知道转换是否被允许。所以我们应该询问它并通过更改 css 显示属性来处理答案。
但是有两个特性对实现有很大的影响:
A) CanActivate 接口(interface)不太舒服,因为要调用它我们必须创建 ActivatedRouteSnapshot 和 RouterStateSnapshot 对象。真正的过渡可能是必要的,但在这种情况下,我们只想知道过渡是否可能。
B) 我们应该在某些事件(在我的例子中是登录事件)之后提供链接可见性刷新
为了解决问题 A,我创建了接口(interface) Guard。
export interface Guard {
allowTransition():boolean;
}
所以,我希望我所有的 CanActivate 实现也实现 Guard 接口(interface)。现在我典型的 CanActivate 实现看起来像这样:
canActivate(route:ActivatedRouteSnapshot,
state:RouterStateSnapshot):Observable<boolean>|boolean {
//this method performs only "naigation" logic. It calls another method for business logic.
var allow = this.allowTransition();
if (!allow) {
this.router.navigate(['login']);
}
return allow;
}
allowTransition():boolean {
// this method contains business logic of transition possibility
return this.userService.hasCurrentUserRole("USER");
}
在这样的“接口(interface)划分”之后,我可以从我的指令中调用简单的方法 allowTransition()。代码如下。
import {routes} from "../../../app.routes";
... other imports
@Directive({selector: '[allowTransition]'})
export class AllowTransition implements OnDestroy, LoginListener, OnInit {
private el: HTMLElement;
private visibleDisplay:string;
@Input('allowTransition') destUrl: string;
constructor(el: ElementRef, private injector: Injector,
@Inject('appUserService') private userService : UserService ) {
this.el = el.nativeElement;
this.visibleDisplay = this.el.style.display;
}
ngOnDestroy() {
this.userService.removeLoginListener(this)
}
ngOnInit() {
this.userService.addLoginListener(this);
this.onLogin();
}
onLogin() {
let allow = true;
for (let i = 0; i < routes.length; i++) {
let path = routes[i].path;
if (path == this.destUrl) {
let canActivate = routes[i].canActivate;
if (canActivate != null) {
//todo do the same for canActivate[i]
try {
let canActivateInstance = this.injector.get(canActivate[0]) as Guard;
allow = canActivateInstance.allowTransition();
} catch (error) {
//did you forget to implement Guard?
console.error('Error');
}
}
}
}
this.el.style.display = allow ? this.visibleDisplay : 'none';
}
}
我在上面提到了问题 B,这就是为什么我的指令使用一种方法 onLogin() 实现 LoginListener 接口(interface)。虽然该指令存在,但它应该在事件生产者处注册并在发生变化时进行处理。在我的例子中,登录或注销后 UserService 调用所有指令的方法 onLogin() 并且每个链接都刷新。
初始显示属性也可以有多个值,这就是指令必须将其保留为“visibleDisplay”属性的原因。
作为结论,现在可以在没有任何关于与路由对应的组件的信息的情况下使用该指令。这种方法的主要缺点是它不适用于像“view/:id”这样的动态路由。也不允许在 CanActivate 方法中使用 Observale 而不是 bool 值。当然,可以修复它,但在我看来,我这样做的方式对于这么简单的事情来说已经太复杂了。我刚刚完成了我需要的所有工作,等待具有类似功能的 angular2 更新。
更多信息:https://kosbr.github.io/2016/10/18/angular2-guard-router.html
关于angular - 如果无法激活其关联路由,则隐藏 routerLink?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38976109/
In the Angular documentation , routerLink指令选择器定义为: :not(a)[routerLink] 据我所知,这意味着“所有具有routerLink属性的非标
[routerLink] 和 routerLink 有什么区别?你应该如何使用它们? 最佳答案 您会在所有指令中看到这一点: 当您使用括号时,这意味着您正在传递一个可绑定(bind)属性(一个变量)。
我真的很困惑我是否应该使用 About 或 About 最佳答案 两者都是正确的。 About 和 About 将路径作为字符串传递 同时 About 传递一组路由器命令。 两者都受支持。 https
我想从一个 html 页面使用 routerLink 和 state 路由到另一个页面。使用标签没有问题,在登录页面中的 ngOnInit 期间,我可以按预期检索状态。使用标签主页也是导航,但状态结果
我试图在我的 routerLink 中传递一个 id,我怎么能连接它? doesnt work. 你有解决方案吗? 提前致谢 最佳答案 你去吧。 Link 关于 Angular 变量到 rou
所以我有一个包含 2 个独立部分的应用程序,需要单独导航,我认为 Aux Routing 是可行的方法。 这是我的路线: export const ROUTES: Routes = [ { pat
我有一个routerLink在我的页面上,转到某个路线,但我收到此错误 基本上,我有一个具有唯一 id 的 Assets 页面,然后当您单击按钮时,id 会发生变化,并且路线应该更新,因此 asset
我对此组件的 html 调用 这是一个动态组件,然后在 onBtnActionClicked($event) 中需要像这样重定向 {{detail.detailId}} 但是正如你所
我的主 app.html 文件中有一个简单的应用程序,其结构如下。 在我的导航列表组件中,我可以轻松创建 routerLinks,如下所示: link 但是,当我进入路由器导出内呈
我正在尝试将 routerLink 与以下函数一起使用: Home callHome(data){ //perform some operations this.router.navig
我在教程中看到他们对 routerLink 属性使用了两种类型的语法。 我找不到任何说明它们之间差异的文档。 最佳答案 这是关于 Angular 非常重要的了解!当您在属性周围使用 [] 时,这意
... path: ':category/:page', ... {{category.attributes.name}} 浏览器中routerLink的第一个参数是NaN。我该如何修复它?
我正在尝试创建一个具有登录功能的 Angular 应用程序。 我用过ng cli生成空白应用程序。它带有 AppComponent 。 然后我创建了一个 LoginComponent和一个 HomeC
我有 2 一切都很好,这是我的RouteConfig在配置文件组件内: @Component({ selector : "profile", templateUrl: '/client
在这个演示应用程序中,我在延迟加载的书籍模块中有以下路由: { path: 'collection', component: CollectionPageComponent }, 并在搜索组件中使用以
我已经使用路由器链接在我的网络应用程序中添加了页面导航,出于某种原因,该页面大部分时间只是重新加载,而在其他时候它工作正常,非常随机。 我很困惑,尤其是为什么它会随机工作。任何见解都会有所帮助。 相关
我从 Vue.js 中的 VueRouter 开始,我遇到了这个错误: [Vue warn]: $attrs is readonly. found in ---> at resources\
我只想在一条路线上删除一个类(class),(或者在所有但只有一条路线上添加一个类(class)。)这怎么可能?我已经尝试使用多个参数的 [routerLink] 无济于事:
我正在制作一个电子商务网站,我的目标是每个对象有多个输入点,例如,他们单击/点击卡片上除按钮以外的任何地方,它将在单击/时转到产品详细信息/点击按钮会将该项目添加到购物车。 目前我转发到详情没有问题,
我想要一种更好的方式来编写这些代码行。 1" class="page-item"> First 1)" class="page-item disabled"> First
我是一名优秀的程序员,十分优秀!