You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular根据用户角色控制侧边菜单的显示与隐藏

实现Angular侧边菜单的角色权限控制

根据你的需求,我们可以通过两种方式实现菜单的条件显示:直接在模板中用*ngIf控制,或者在组件内预处理菜单数据。

方法一:模板内直接控制显示

直接在现有模板的对应元素上添加*ngIf判断,根据用户角色过滤菜单:

修改后的模板代码:

<ul class="sidebar-menu collapsible collapsible-accordion" data-collapsible="accordion">
  <ng-container>
    <!-- 父菜单:角色为2时隐藏Prepaid -->
    <li *ngFor="let parentMenu of sideMenuResponse" class="no-padding"
        *ngIf="!(parentMenu.title === 'Prepaid' && userRoles.includes(2))">
      <a class="collapsible-header">
        <i class="material-icons"></i> {{parentMenu.title}}
        <i class="nav-drop-icon material-icons">keyboard_arrow_right</i>
      </a>
      <div class="collapsible-body">
        <ul *ngFor="let submenu of parentMenu.subMenu">
          <!-- 子菜单:角色为1时隐藏Initiate -->
          <li *ngIf="!(submenu.subMenu1 === 'Initiate' && userRoles.includes(1))">
            <a target="_self" [routerLink]="">
              {{submenu.subMenu1}}
            </a>
          </li>
        </ul>
      </div>
    </li>
  </ng-container>
</ul>

逻辑说明

  • 父菜单判断:当父菜单标题为Prepaid且用户角色包含2时,隐藏该父菜单
  • 子菜单判断:当子菜单标题为Initiate且用户角色包含1时,隐藏该子菜单

方法二:组件内预处理菜单数据

如果菜单结构复杂,推荐在组件中先过滤好符合权限的菜单数据,再传递给模板渲染,这样模板更简洁:

组件代码示例(假设你在获取服务器响应后处理):

// 假设已获取服务器返回的menu数据并赋值给sideMenuResponse
this.sideMenuResponse = this.sideMenuResponse.filter(parentMenu => {
  // 过滤Prepaid父菜单:角色为2时排除
  if (parentMenu.title === 'Prepaid' && this.userRoles.includes(2)) {
    return false;
  }
  // 过滤Initiate子菜单:角色为1时移除
  parentMenu.subMenu = parentMenu.subMenu.filter(submenu => {
    return !(submenu.subMenu1 === 'Initiate' && this.userRoles.includes(1));
  });
  // 可选:如果父菜单过滤后没有子菜单,也可以选择隐藏父菜单
  // return parentMenu.subMenu.length > 0;
  return true;
});

此时模板无需修改,直接使用处理后的sideMenuResponse即可。

内容的提问来源于stack exchange,提问作者vishnu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 04:45:41