我正在try 基于用户权限构建菜单.下面是上述数组的简化示例:

this.model = [
    {
        label: "Admin",
        items: [
            {
                label: "Users",
                icon: "fas fa-list",
                routerLink: ["/admin/users/"],
            },
            {
                label: "Clients",
                icon: "fas fa-list",
                items: [
                    {
                        label: "List",
                        icon: "fas fa-list",
                        routerLink: ["/client/list"],
                    },
                    {
                        label: "Create",
                        icon: "fas fa-list",
                        routerLink: ["/client/create/"],
                    },
                ],
            },
        ],
    },
];

该数组负责在其各自的组件中生成菜单标记,如下所示:

<ul class="layout-menu">
    <ng-container *ngFor="let item of model; let i = index;">
        <li app-menuitem *ngIf="!item.separator" [item]="item" [index]="i" [root]="true"></li>
        <li *ngIf="item.separator" class="menu-separator"></li>
    </ng-container>
</ul>

现在,我在sessionStorage中存储了一系列用户权限,作为访问的布尔值.我需要使用这些权限来添加或减少基于它们的菜单项目.

例如,如果"canCreateClients"为FALSE,则不应显示菜单的"/CLIENT/CREATE/"部分.

我大致了解如何使用三元操作符在JSON中应用条件值,但这是一个对象数组,由于下拉菜单项,它可以无限嵌套,因此它最终也会有嵌套操作符.

我可以通过在一个临时变量中创建整个数组,然后根据权限单独删除每个对象来解决这个问题.然而,这是非常不切实际的.

什么是解决这一问题的好办法?

推荐答案

针对此类场景的健壮的通用解决方案可能有些过头了.我的方法是在站点 map 数据中包括必要的权限布尔值,并让呈现模板比较所需的权限和用户的权限,以决定是否呈现该特定项目.

因此,单个项目可能如下所示

{
   label: "Create",
   icon: "fas fa-list",
   routerLink: ["/client/create/"],
   permissionReqired: "canCreateClients"
}

在递归遍历树的每一项时,呈现代码可以将"permissionRequired"键的内容与特定用户的权限数组进行比较.我的Angular 生疏了,所以我不会try 将其编码出来,但伪代码可能是这样的

usersPermissions= ['canCreateClients', 'canDoTheThing'] // loaded from user data somewhere

if (!item.permissionRequired || usersPermissions.includes(item.permissionRequired)) {
  // render the item
}

这样,您只需要担心一棵树,所有不同的权限要求都记录在其中,呈现代码不必包括许多条件,它只需要将一个字段与一个数组进行比较,看看它们是否匹配.

Json相关问答推荐

JoltChange:将输入数组的每个对象拆分为2个独立的对象,并将其放入输出数组中

try 将文本标记放置在条形图上的同一高度

输入请求中不存在null的条件抖动

PowerShell脚本-替换json数组(转义$var将被视为不带双引号的文本)

Vega图表计数聚合如果数据值为空数组则不显示任何内容,如何解决此问题?

如何将响应数据保存到Flutter 中的共享首选项中

无法访问id的第三级json

将 json 转换为 jsonb 安全吗?

GitHub Pages无法正确显示我的项目

从 JSON 响应中获取最新版本发布字段

如何让 JSON.NET 忽略对象关系?

如何判断字符串是否为json格式

Python Flask-Restful POST 不采用 JSON 参数

在 Rails 中使用 JSON 创建嵌套对象

在 Django 1.9 中,使用 JSONField(本机 postgres jsonb)的约定是什么?

在视图中将 .Net 对象转换为 JSON 对象

如何将单引号转义成双引号转成单引号

MVC JsonResult camelCase 序列化

python追加到json对象中的数组

使用新的 Net Core 3.0 Json 时忽略属性