我想为组件添加保护.
如果用户没有权限查看此组件,则不会呈现该组件.
我已经尝试将我的if放在构造函数中并返回false但它仍然呈现.
我还将if添加到模板本身,但后来我没有看到视图,但组件仍处于活动状态,这增加了代码的复杂性,因为我需要维护相同的几个地方.
有没有办法告诉组件根本不渲染?
constructor( private userService: UserService) {
if (this.userService.isAllowed("see_trade_groups") === false) {
return;
}
}
解决方法:
组件编译生命周期由Angular编译器处理,因此组件无法控制自己的生命周期,应该从外部控制它.
处理此问题的常用方法是使用路由器.路由组件的生命周期与常规组件不同,因为它由路由器处理;它们被附加到< router-outlet>零件.它可能是prevent compilation in route components但不是常规组件.
否则,应该使用指令处理. ngIf是内置的方法,可以防止编译常规组件.
所以它变成了
<foo *ngIf="userService.isAllowed('see_trade_groups')"></foo>
由于这需要在每次需要时将userService注入父组件,这将导致大量的样板代码.一个合适的解决方案是创建一个行为与ngIf类似的指令 – 或者扩展它以提供所需的功能:
import {Input, OnChanges, SimpleChanges, TemplateRef, ViewContainerRef} from '@angular/core';
import {NgIf, NgIfContext} from '@angular/common';
...
@Directive({
selector: '[role]'
})
class Role extends NgIf {
@Input() role: string;
constructor(
viewContainer: ViewContainerRef,
templateRef: TemplateRef<NgIfContext>
public userService: User
) {
super(viewContainer, templateRef);
}
ngOnChanges({ role }: SimpleChanges) {
this.ngIf = this.userService.isAllowed(role);
// can also subscribe to some observable to add/remove a component any time
}
}
使用如下:
<foo *role="'see_trade_groups'"></foo>
请注意,Role是*结构指令.这允许它控制指定元素的编译,类似于ngIf和ngFor的工作方式.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。