代码之家  ›  专栏  ›  技术社区  ›  Amit Wagner

角度4。基于if删除构造函数中的组件

  •  3
  • Amit Wagner  · 技术社区  · 8 年前

    我想为组件添加保护。 如果用户没有查看此组件的权限,则不会对其进行渲染。

    我试着把我的 if 在构造函数中并返回 false 但它仍然渲染。

    我还添加了 如果 但我没有看到视图,但组件仍然存在,这增加了代码的复杂性,因为我需要维护相同的多个位置 如果 .

    有没有办法告诉组件根本不要渲染?

     constructor( private userService: UserService) {
        if (this.userService.isAllowed("see_trade_groups") === false) {
               return;
        }
    }
    2 回复  |  直到 8 年前
        1
  •  3
  •   Suren Srapyan    8 年前

    为此,你可以看到 CanActivate . 把它放在部件上 route 它会完成你想要的工作。

    这样,您就可以编写一个逻辑,根据它来导航或不导航路线。

        2
  •  2
  •   Estus Flask    8 年前

    组件编译生命周期由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