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

Angular 6中Ng-bootstrap Collapse组件独立切换实现方法咨询

解决Angular 6中多个Ng-bootstrap Collapse组件独立切换的问题

你遇到的问题很典型——现在的代码里所有折叠组件都共享了同一个isCollapsed状态变量,所以点击任意一个按钮时,这个变量的变化会同时作用于所有绑定它的[ngbCollapse]指令,导致所有组件一起展开或折叠。

要实现独立切换,核心思路是给每个Collapse分配独立的状态变量,下面分两种场景给出解决方案:

一、固定数量的Collapse(比如你示例里的2个)

这种情况直接给每个组件定义单独的状态变量即可:

1. 在组件类中添加独立状态变量

// 组件.ts文件
import { Component } from '@angular/core';

@Component({
  selector: 'app-your-component',
  templateUrl: './your-component.component.html'
})
export class YourComponentComponent {
  // 为每个Collapse定义独立的状态变量
  isCollapsed1 = false;
  isCollapsed2 = false;
}

2. 修改模板代码,分别绑定对应变量

<div class="row">
  <div class="col-6">
    <button type="button" class="btn btn-outline-primary" 
            (click)="isCollapsed1 = !isCollapsed1" 
            [attr.aria-expanded]="!isCollapsed1" 
            aria-controls="collapseExample">
      Toggle
    </button>
    <div id="collapseExample" [ngbCollapse]="isCollapsed1">
      <div class="card">
        <div class="card-body">
          You can collapse this card by clicking Toggle
        </div>
      </div>
    </div>
  </div>
  <div class="col-6">
    <button type="button" class="btn btn-outline-primary" 
            (click)="isCollapsed2 = !isCollapsed2" 
            [attr.aria-expanded]="!isCollapsed2" 
            aria-controls="collapseExample2">
      Toggle
    </button>
    <div id="collapseExample2" [ngbCollapse]="isCollapsed2">
      <div class="card">
        <div class="card-body">
          You can collapse this card by clicking Toggle
        </div>
      </div>
    </div>
  </div>
</div>

二、动态生成/数量较多的Collapse

如果你的Collapse是动态生成的(比如从数组循环渲染),或者数量很多,用数组来管理状态会更高效:

1. 组件类中定义状态数组

// 组件.ts文件
import { Component } from '@angular/core';

@Component({
  selector: 'app-your-component',
  templateUrl: './your-component.component.html'
})
export class YourComponentComponent {
  // 数组的每个元素对应一个Collapse的状态,初始都为折叠状态(false)
  collapseStates: boolean[] = [false, false]; 
  // 如果是动态生成,可以根据数据源长度初始化,比如:
  // collapseStates = Array(this.yourData.length).fill(false);
}

2. 模板中通过索引绑定状态

<div class="row">
  <!-- 用*ngFor循环渲染,通过索引操作对应状态 -->
  <div class="col-6" *ngFor="let state of collapseStates; index as i">
    <button type="button" class="btn btn-outline-primary" 
            (click)="collapseStates[i] = !collapseStates[i]" 
            [attr.aria-expanded]="!collapseStates[i]" 
            aria-controls="collapseExample{{i+1}}">
      Toggle {{i+1}}
    </button>
    <div id="collapseExample{{i+1}}" [ngbCollapse]="collapseStates[i]">
      <div class="card">
        <div class="card-body">
          You can collapse this card by clicking Toggle {{i+1}}
        </div>
      </div>
    </div>
  </div>
</div>

这样不管你有多少个Collapse,都能独立控制它们的展开/折叠状态啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:49:42