【问题标题】:ngx-bootstrap-accordion hide/show when button is clickedngx-bootstrap-accordion 在单击按钮时隐藏/显示
【发布时间】:2026-01-03 06:50:02
【问题描述】:

我有动画ngx-bootstrap-accordion 但如果我点击得足够快,标签与accordion 的状态不符。如果有要隐藏的内容,我希望标签显示 hide,而不是在内容可见时显示。

更新示例:https://stackblitz.com/edit/ngx-bootstrap-accordion-asasasa2-zb5ki6

在此处查看闪电战: https://stackblitz.com/edit/ngx-bootstrap-accordion-asasasa2

app.component.ts

import { ViewChild } from '@angular/core';
import { AccordionPanelComponent } from 'ngx-bootstrap/accordion';
import {AfterViewInit, Component, Inject, OnInit} from '@angular/core';
import {TranslateService} from '@ngx-translate/core';
import {ViewportScroller} from '@angular/common';
import {Router} from '@angular/router';
import { StorageService, SESSION_STORAGE} from 'ngx-webstorage-service';

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: [ './app.component.css' ]
})
export class AppComponent  {
  sections = [
    {
      code: 'a',
      visible: true,
      subsections: null
    },
    {
      code: 'p',
      visible: true,
      subsections: null
    }
  ];
}

app.component.html

<div class="toolbar">
    <h2>Toolbar</h2>
</div>

<div class="content">
    <accordion [isAnimated]="true">
        <accordion-group *ngFor="let subsection of sections" [isOpen]="subsection.visible" class="app-accordion-group">

            <div class="app-subsection-accordion-header" accordion-heading >

                <button *ngIf="subsection.visible"  (click)="subsection.visible = !subsection.visible">
               Open panel 2
             </button>

                <button *ngIf="!subsection.visible" (click)="subsection.visible = !subsection.visible">
              Hide panel 2
            </button>

                <div class="app-header-title">
                    text
                </div>
            </div>
            <div class="app-document app-desktopVisible">
                doc
            </div>
        </accordion-group>
    </accordion>
</div>

【问题讨论】:

    标签: angular typescript angular8 ngx-bootstrap


    【解决方案1】:

    由于您改变了模板上的可见属性,因此对象的引用没有改变,因此不会触发手风琴组件更改检测。

    试试这个:

    component.html

        <button *ngIf="subsection.visible"  (click)="toggle(i)">
               Open panel
         </button>
    

    component.ts

    toggle(index){
        this.sections[index] = {
          ... this.sections[index],visible: ! this.sections[index].visible
     }
    }
    

    Forked Example

    【讨论】:

    • 仅将代码添加到 component.ts 并不能解决此问题 - 请参阅 blitz。来自 html 的代码是相同的。我想让它说 Open panel 如果有内容隐藏,Hide panel 如果有内容可见。示例中的内容为doc。尝试在blitz 中快速单击按钮hide/show panel。当doc 字被隐藏时,我可以让它说Hide panel
    • 也许这个例子并不完美,注意我们在 html 中操作的是 subsection 而不是 section。我们想隐藏/显示subsectionsdoc 文本可以是来自 subsection 的文本,并且不应为空。我会更新的。
    • 我添加了更新的示例,我想对subsections 进行操作,并且我想禁用默认的手风琴行为,当点击它时隐藏/显示内容,我希望它只在我隐藏/显示时将单击按钮。对不起,对于前面的不精确的例子。我希望从一开始就可以看到这些部分,但是在鼠标单击按钮后应该可以看到子部分。
    • 这里剩下的问题:stackblitz.com/edit/ngx-bootstrap-accordion-asasasa2-zb5ki6 是为了防止手风琴在点击它时自己的行为 - 它应该只对按钮做出反应。 minor 问题,但只有在 blitz 中,由于 ERROR Error: ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it was checked. Previous value: 'panel-open: true'. Current value: 'panel-open: false',这些部分对 [isOpen]="true" 没有正确反应
    • 你的意思是所有部分都应该默认可见?
    最近更新 更多