Angular4手风琴菜单循环API响应时数据缺失问题求助
解决手风琴菜单层级数据绑定问题
嗨,我帮你梳理下问题:你现在只渲染出1个group,核心原因是没有用*ngFor遍历所有的group数组项,而是直接取了第一个group数据。接下来给你具体的修改方案,完美适配你的层级结构(category → 4个group → 每个group下2个subgroup):
第一步:确认数据结构
先确保你的API返回的JSON结构是类似这样的(group必须是数组,才能遍历出4个项):
// 组件中接收的API数据示例 menuData = { category: "你的主分类名称", groups: [ { group: "组1", subgroups: [{ subgroup: "子组1-1" }, { subgroup: "子组1-2" }] }, { group: "组2", subgroups: [{ subgroup: "子组2-1" }, { subgroup: "子组2-2" }] }, { group: "组3", subgroups: [{ subgroup: "子组3-1" }, { subgroup: "子组3-2" }] }, { group: "组4", subgroups: [{ subgroup: "子组4-1" }, { subgroup: "子组4-2" }] } ] };
第二步:修改模板代码
把你的手风琴模板改成下面这样,重点是用*ngFor遍历所有group和subgroup,同时动态生成唯一的ID(避免Bootstrap手风琴交互冲突):
<div class="accordion" id="mainAccordion"> <!-- 主分类折叠面板 --> <div class="accordion-item"> <h2 class="accordion-header" id="categoryHeading"> <button class="accordion-button" type="button" data-bs-toggle="collapse" data-bs-target="#categoryCollapse" aria-expanded="true" aria-controls="categoryCollapse"> {{ menuData.category }} </button> </h2> <div id="categoryCollapse" class="accordion-collapse collapse show" aria-labelledby="categoryHeading" data-bs-parent="#mainAccordion"> <div class="accordion-body"> <!-- 遍历所有4个group --> <div *ngFor="let group of menuData.groups; let groupIndex = index" class="accordion" [id]="'groupAccordion-' + groupIndex"> <div class="accordion-item"> <h2 class="accordion-header" [id]="'groupHeading-' + groupIndex"> <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" [attr.data-bs-target]="'#groupCollapse-' + groupIndex" aria-expanded="false" [attr.aria-controls]="'groupCollapse-' + groupIndex"> {{ group.group }} </button> </h2> <div [id]="'groupCollapse-' + groupIndex" class="accordion-collapse collapse" [attr.aria-labelledby]="'groupHeading-' + groupIndex" [attr.data-bs-parent]="'#groupAccordion-' + groupIndex"> <div class="accordion-body"> <!-- 遍历当前group下的2个subgroup --> <div *ngFor="let subgroup of group.subgroups; let subIndex = index" class="mb-2"> <span class="fw-bold">子组{{ groupIndex + 1 }}-{{ subIndex + 1 }}:</span> {{ subgroup.subgroup }} </div> <!-- 如果subgroup也要做成折叠项,替换成下面的手风琴结构 --> <!-- <div class="accordion" [id]="'subgroupAccordion-' + groupIndex + '-' + subIndex"> <div class="accordion-item"> <h2 class="accordion-header" [id]="'subgroupHeading-' + groupIndex + '-' + subIndex"> <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" [attr.data-bs-target]="'#subgroupCollapse-' + groupIndex + '-' + subIndex" aria-expanded="false" [attr.aria-controls]="'subgroupCollapse-' + groupIndex + '-' + subIndex"> {{ subgroup.subgroup }} </button> </h2> <div [id]="'subgroupCollapse-' + groupIndex + '-' + subIndex" class="accordion-collapse collapse" [attr.aria-labelledby]="'subgroupHeading-' + groupIndex + '-' + subIndex" [attr.data-bs-parent]="'#subgroupAccordion-' + groupIndex + '-' + subIndex"> <div class="accordion-body"> 这里放子组的具体内容 </div> </div> </div> </div> --> </div> </div> </div> </div> </div> </div> </div> </div>
关键注意点
- 动态ID生成:用
groupIndex和subIndex拼接ID,确保每个折叠面板的ID唯一,否则Bootstrap手风琴的展开/收起会出现异常。 - 数组遍历:必须用
*ngFor="let group of menuData.groups"遍历所有group,不能直接取menuData.groups[0](这就是你之前只显示1个group的原因)。 - 数据格式校验:如果API返回的
groups不是数组,那要先在组件里把它转成数组,比如用Array.isArray(data.groups) ? data.groups : [data.groups]处理。
这样修改后,就能正确渲染出1个category、4个group,每个group下2个subgroup的完整手风琴菜单啦!
内容的提问来源于stack exchange,提问作者Nikson
相关产品推荐
相关产品推荐

