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

Angular 6父子关系Div的Toggle展开折叠异常问题求助

解决Angular 6父子列表Toggle按钮同步展开的问题

嘿,我一眼就看出问题所在啦——你现在用的是组件级的单个clickPlus变量来控制所有父项的展开/收起状态,所有父元素都绑定同一个变量,那肯定点一个就全跟着变了!

问题根源

你当前的代码里,所有父项的展开状态都依赖同一个clickPlus变量:

[ngClass]="[clickPlus === false ? 'fa fa-plus-circle' : 'fa fa-minus-circle']"
(click)="clickPlus=!clickPlus"
*ngIf="clickPlus"

这就导致只要这个变量一变,所有父项的子元素都会同步显示/隐藏。

修复步骤

1. 给每个userRole对象添加独立的展开状态属性

在你获取API数据之后,给每个userRole加上一个isExpanded属性(名字可自定义,语义化即可),初始设为false(默认收起):

// 假设你在组件里获取数据的方法是这样的
this.yourApiService.getUserRoles().subscribe(data => {
  this.userRoleActions = data.map(role => ({
    ...role,
    isExpanded: false // 给每个角色添加独立的展开状态
  }));
});

2. 修改模板,使用每个userRole自己的状态变量

把原来的clickPlus替换成userRole.isExpanded,这样每个父项的状态都是独立的:

<div class="table rts-table-parentChild" *ngFor="let userRole of userRoleActions; let i = index">
 <div class="table-row table-header">
 <div class="table-cell">
 <span *ngIf="userRole.userRoleSubActions.length" 
       id="section{{userRole.actionName}}" 
       class="margin-right-5 fa fa-plus-circle" 
       role="button" 
       tabindex="0" 
       [ngClass]="[userRole.isExpanded === false ? 'fa fa-plus-circle' : 'fa fa-minus-circle']" 
       (click)="userRole.isExpanded=!userRole.isExpanded">
 </span>
 {{userRole.actionName}}
 </div>
 <div class="table-cell">
 <input type="checkbox" [ngModelOptions]="{standalone: true}" class="setup-checkbox" id="ChekCreate{{userRole.actionName}}" [(ngModel)]="userRole.isCreateChecked" (click)="selectParentRole(i,'create')">
 </div>
 <div class="table-cell">
 <input type="checkbox"[ngModelOptions]="{standalone: true}" class="setup-checkbox" id="ChekDelete{{userRole.actionName}}" [(ngModel)]="userRole.isDeleteChecked" (click)="selectParentRole(i,'delete')">
 </div>
 </div>
 <ng-container *ngIf="userRole.isExpanded">
 <div style="display:table-row-group;" *ngFor="let item of userRole.userRoleSubActions; let j = index">
 <div class="table-row ">
 <div class="table-cell subj">
 {{item.actionName}}</div>
 <div class="table-cell">
 <input type="checkbox" [ngModelOptions]="{standalone: true}" class="setup-checkbox" [(ngModel)]="item.isCreateChecked" (change)="isCreateChecked(i,'create')">
 </div>
 <div class="table-cell">
 <input type="checkbox" [ngModelOptions]="{standalone: true}" class="setup-checkbox" [(ngModel)]="item.isDeleteChecked" (change)="isCreateChecked(i,'delete')">
 </div>
 </div>
 </div>
 </ng-container>
</div>

3. (可选)移除组件里冗余的变量

既然不再使用clickPlus,就把组件类里定义的clickPlus: boolean = false;删掉,避免代码冗余。

额外小优化

你模板里子项的第一个单元格重复写了两次class="table-cell",我已经帮你合并成class="table-cell subj"啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:49:45