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

Angular Material 如何隐藏mat-select中已禁用的下拉选项

可行解决方案

方案1:预过滤数据源(最优方案)

直接在渲染前把无权限的用户从渲染列表中剔除,从根源上避免无权限选项被渲染,不会产生任何空白占位问题。
你可以在组件的ts文件中新增过滤后的用户列表属性:

// 组件ts文件新增逻辑
allowedUsers = this.users.filter(user => user.permission !== 'N');

然后修改HTML中的遍历逻辑,直接使用过滤后的列表即可:

<div class="material-input">
  <mat-form-field class="form-group-select">
    <mat-label>User name</mat-label>
    <mat-select class="select" placeholder="User names"
      formControlName="user">
      <mat-option  *ngFor="let user of allowedUsers"
        [value]="user.id">
        {{user.name}}
      </mat-option>
    </mat-select>
  </mat-form-field>
</div>

如果你的用户列表是动态更新的,把过滤逻辑写在用户列表赋值的位置,或者用计算属性实现实时过滤即可。

方案2:CSS强制隐藏(适合必须保留无权限选项DOM的特殊场景)

之前的样式不生效是因为没有清除mat-option自带的默认内边距、行高样式,同时mat-select的下拉面板默认脱离当前组件样式作用域,需要用穿透样式处理:
在组件的样式文件中添加如下规则:

::ng-deep mat-option[disabled] {
  display: none !important;
  height: 0 !important;
  padding: 0 !important;
  margin: 0 !important;
  overflow: hidden;
}

你的原有HTML代码不需要修改,该样式会自动隐藏所有被禁用的mat-option,且不会残留空白区域。

优先使用方案1,性能更高、逻辑更清晰,不会产生额外的样式污染问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 07:24:02