美文网首页
创建自定义的 Angular 指令 (3)

创建自定义的 Angular 指令 (3)

作者: 品品下午茶 | 来源:发表于2022-05-16 14:22 被阅读0次

在一个典型的 Angular 企业应用中,用户会被分配若干角色,角色又被分配相应的功能权限。于是,用户就可以访问其角色对应的应用功能,也称基于角色的访问控制(Role-based Access Control)。

本文会介绍如何创建一个自定义的结构指令,该指令会验证用户的角色,显示或移除应用功能的视图模板。

创建指令文件

首先,通过 Angular CLI 命令,创建指令的源代码文件。

ng generate directive permission

命令输出结果:

CREATE src/app/permission.directive.spec.ts (240 bytes)
CREATE src/app/permission.directive.ts (149 bytes)
UPDATE src/app/app.module.ts (696 bytes)

角色属性

打开 src/app/permission.directive.ts 指令文件,添加下列属性:

  @Input() appPermission: string[];
  private currentRole = ‘admin’;
  • appPermission 属性是一个输入属性,可以接收父级组件传入的角色数据的数组,表示用户必须具有数组中的角色之一,才可以访问该组件。
  • currentRole 属性则表示当前用户所具有的角色。

角色验证

permission 组件类的构造函数中,添加两个参数:

constructor(private tmplRef: TemplateRef<any>, private vc: ViewContainerRef) {}
  • TemplateRef:Angular 生成的视图模板。
  • ViewContainerRef:装载视图模板的容器。

ngOnInit 方法中,添加权限验证的逻辑:

  ngOnInit() {
    if (this.appPermission.indexOf(this.currentRole) === -1) {
      this.vc.clear();
    } else {
      this.vc.createEmbeddedView(this.tmplRef);
    }
  }

如果 currentRole 表示的角色,出现在角色列表中,ViewContainerRef 会把产生的视图模板添加到 DOM 中,否则,从 DOM 中移除该视图模板。

页面效果

normal角色展示效果

检查视图模板代码:

<div _ngcontent-kqs-c15=“”>
    <p _ngcontent-kqs-c15="">['admin', 'normal']</p>
</div>
<!—bindings={
  "ng-reflect-app-permission": "admin,normal”
}—>
<!—bindings={
  "ng-reflect-app-permission": “admin”
}—>
admin角色展示效果

检查视图模板代码:

<div _ngcontent-rry-c15=“”>
    <p _ngcontent-rry-c15="">['admin', 'normal']</p>
</div>
<!—bindings={
  "ng-reflect-app-permission": "admin,normal”
}—>
<div _ngcontent-rry-c15=“”>
    <p _ngcontent-rry-c15="">['admin']</p>
</div>
<!—bindings={
  "ng-reflect-app-permission": “admin”
}—>

源代码

src/app/permission.directive.ts

import { Directive, Input, TemplateRef, ViewContainerRef } from '@angular/core’;

@Directive({
  selector: '[appPermission]’
})
export class PermissionDirective {

  // The name of the input property must have
  // the same name as the selector of the directive
  @Input() appPermission: string[];
  private currentRole = ‘admin’;

  constructor(private tmplRef: TemplateRef<any>, private vc: ViewContainerRef) {
  }

  ngOnInit() {
    if (this.appPermission.indexOf(this.currentRole) === -1) {
      this.vc.clear();
    } else {
      this.vc.createEmbeddedView(this.tmplRef);
    }
  }

}

src/app/app.component.html

<p>
  <input type="text” appAlphabet>
</p>

<div *appPermission="['admin', 'normal’]”>
  <p>['admin', 'normal']</p>
</div>

<div *appPermission="['admin’]”>
  <p>['admin']</p>
</div>

相关文章

网友评论

      本文标题:创建自定义的 Angular 指令 (3)

      本文链接:https://www.haomeiwen.com/subject/iutmurtx.html