让我的手风琴动态响应?

Cod*_*ior 2 accordion twitter-bootstrap typescript angular

我创建了一个手风琴组件,用于填充父组件动态提供的值。我无法实现的是每个手风琴都应该响应各自的点击。目前,无论我单击哪个手风琴,它都会折叠并展开第一个。这是我的代码:

数组parent.component.ts

import { Component, AfterViewInit, OnInit } from '@angular/core';

@Component({
    selector: 'my-array-parent',
    templateUrl: './array-parent.component.html',
})
export class ArrayParentComponent implements OnInit {
    private content: Test[];

    ngOnInit(): void {
        this.content = [{
            heading: 'header1',
            testData: [{
                title: 'title1',
                content: 'content1'
            }, {
                title: 'title2',
                content: 'content2'
            }]
        }, {
            heading: 'header2',
            testData: [{
                title: 'title1',
                content: 'content1'
            }, {
                title: 'title2',
                content: 'content2'
            }]
        }]
    }
}

export class Test {
    heading: string;
    testData: TestItem[];
}

export class TestItem {
    title: string;
    content: string;
}
Run Code Online (Sandbox Code Playgroud)

array-parent.component.html

<ng-container *ngFor="let item of content">
    <my-array [data]="item"></my-array>
</ng-container>
Run Code Online (Sandbox Code Playgroud)

数组.component.ts

import { Component, Input, OnInit, AfterViewInit } from '@angular/core';

@Component({
    selector: 'my-array',
    templateUrl: './array.component.html'
})

export class ArrayComponent implements OnInit {

    @Input() data: any;

    private contentObj: any;

    constructor() { }

    ngOnInit(): void {
        this.contentObj = this.data;
    }
}
Run Code Online (Sandbox Code Playgroud)

数组.component.html

<h2>{{contentObj.heading}}</h2>
<div class="columnOne" id="accordion" role="tablist" aria-multiselectable="true">
    <div *ngFor="let item of contentObj.testData;">
        <div role="tab" id="headingone">
            <h4>
                <a role="button" data-toggle="collapse" data-parent="#accordion" href="#collapseone" aria-expanded="true" aria-controls="collapseone">
                    {{item.title}}
                </a>
            </h4>
            <div id="collapseone" class="panel-collapse collapse in" role="tabpanel" aria-labelledby="headingone">
                <div class="panel-body">
                    {{item.content}}
                </div>
            </div>
        </div>
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)

我真正想做的是每个手风琴只有在被点击时才应该展开和折叠。目前,无论我单击哪个手风琴,只有第一个会展开和折叠。我知道这是因为它获得了一个静态 ID。我尝试了一些可能的选项来为所有字段分配动态 ID,但没有成功。任何帮助是极大的赞赏。

Zze*_*Zze 8

您需要绑定引导程序依赖的属性来相应地切换 div:

存在:

  • 面板标题:id, href,aria-controls
  • 面板折叠:idaria-labeledby

这是工作示例中的一个片段:

<div class="panel-heading" role="tab" [id]="'heading'+data.id">
    <h4 class="panel-title">
        <a role="button" data-toggle="collapse" data-parent="#accordion" [href]="'#collapse'+data.id" aria-expanded="true" [attr.aria-controls]="'collapse'+data.id">
            {{data.header}}
        </a>
    </h4>
</div>
<div [id]="'collapse'+data.id" class="panel-collapse collapse" role="tabpanel" [attr.aria-labelledby]="'heading'+data.id">
    <div class="panel-body">
        {{data.content}}
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)

https://stackblitz.com/edit/angular-osvv72

请注意,我们必须为 aria 属性添加前缀,因为它们不是<div>& 的原生属性<a>