ngx-bootstrap手风琴isOpen和isOpenChange导致挂起

问题描述 投票:0回答:2

我可能在这里做一些愚蠢的事情。我有多个团体的手风琴。当一个打开时,另一个应关闭,并且对一个执行了操作后,下一个将打开。您显然可以回去(像步进一样)。

基本格式是这样:

<accordion closeOthers="1">
    <accordion-group (isOpenChange)="state.categoriesOpen = !state.categoriesOpen"
        [isDisabled]="!categories?.length"
        [isOpen]="state.categoriesOpen">
        <div class="btn btn-link"
            accordion-heading>
            <span>1.
                <span *ngIf="!chosenCategory || !criteria"> Choose category</span>
                <span *ngIf="chosenCategory && criteria"> Category | <b>{{chosenCategory?.name}}</b></span>
            </span>
            <mat-icon>{{ state.categoriesOpen ? 'expand_less' : 'expand_more' }}</mat-icon>
        </div>

        <!-- some content here -->
    </accordion-group>
</accordion>

在我的代码中,我定义了这个状态对象:

state: any = {
    categoriesOpen: true,
    criteriaOpen: false,
    attributesOpen: false,
    formulasOpen: false,
};

默认情况下,第一个组是打开的。但是由于某种原因,它会永远挂在这里。当我删除[isOpen]时,它起作用。

有人知道为什么这是坏的吗?

angular ngx-bootstrap
2个回答
0
投票

我不知道我是否完全了解您想要什么,但是让我们看一下示例:

<div class="content">
<accordion closeOthers="1">
<accordion-group #p1 (isOpenChange)="isP1Open = !isP1Open"
    [isDisabled]="!categories?.length"
    [isOpen]="isP1Open">
    <div class="btn btn-link"
        accordion-heading>
        <span>1.
            <span *ngIf="!chosenCategory || !criteria"> Choose category</span>
            <span *ngIf="chosenCategory && criteria"> Category | <b>{{chosenCategory?.name}}</b></span>
        </span>
    </div>
    <button (click)="open(2)">Open panel 2</button>
</accordion-group>
<accordion-group #p2 (isOpenChange)="isP2Open = !isP2Open"
    [isDisabled]="!categories?.length"
    [isOpen]="isP2Open">
    <div class="btn btn-link"
        accordion-heading>
        <span>2.
            <span *ngIf="!chosenCategory || !criteria"> Choose category</span>
            <span *ngIf="chosenCategory && criteria"> Category | <b>{{chosenCategory?.name}}</b></span>
        </span>
    </div>
    <button (click)="open(1)">Open panel 1</button>
</accordion-group>

和相应的代码

import { ViewChild, Component } from '@angular/core';
import { AccordionPanelComponent } from 'ngx-bootstrap/accordion';

 @Component({
   selector: 'my-app',
   templateUrl: './app.component.html',
   styleUrls: [ './app.component.css' ]
  })
  export class AppComponent  {
    @ViewChild('p1') p1: AccordionPanelComponent;
    @ViewChild('p2') p2: AccordionPanelComponent;
    public isP1Open: boolean = false;
    public isP2Open: boolean = true;

    public state: any = {
      categoriesOpen: true,
      criteriaOpen: false,
      attributesOpen: false,
      formulasOpen: false,
    };
    public categories: any = [ {name: "test2"}];

    public chosenCategory:any = {name: "test2"}

    public criteria:any = "whatever";

    open(panelNum) {
      const panel = this[`p${panelNum}`];
      panel.isOpen = !panel.isOpen;
    }
}

这样,您可以逐步浏览手风琴组。我希望这可以帮助您实现目标。请参见此处的示例:https://stackblitz.com/edit/ngx-bootstrap-accordion-panels-lkubjq


0
投票

我通过删除isOpenisOpenChange属性来解决这个问题。相反,我只是使用view child。

<accordion closeOthers="1">
    <accordion-group #categoryGroup
        [isDisabled]="!categories?.length">
        <div class="btn btn-link"
            accordion-heading>
            <span>1.
                <span *ngIf="!chosenCategory || !criteria"> Choose category</span>
                <span *ngIf="chosenCategory && criteria"> Category | <b>{{chosenCategory?.name}}</b></span>
            </span>
            <mat-icon>{{ categoryGroup.isOpen ? 'expand_less' : 'expand_more' }}</mat-icon>
        </div>

        <!-- body -->
    </accordion-group>
<accordion>

然后在代码中,我只是这样做:

@ViewChild('categoryGroup', { static: false }) categoryGroup: AccordionPanelComponent;
@ViewChild('criteriaGroup', { static: false }) criteriaGroup: AccordionPanelComponent;
@ViewChild('attributeGroup', { static: false }) attributeGroup: AccordionPanelComponent;
@ViewChild('formulaGroup', { static: false }) formulaGroup: AccordionPanelComponent;

ngOnInit() {
    this.categoriesSubs = this.selectorService.categories.subscribe(categories => {
        if (!categories) return;
        this.categories = categories;
        this.categoryGroup.isOpen = true;
    });
}

当我想打开任何其他组时,我可以这样称呼它为viewChild:

this.criteriaGroup.isOpen = true;
© www.soinside.com 2019 - 2024. All rights reserved.