可折叠的手风琴

时间:2018-11-19 07:05:26

标签: javascript html angular typescript accordion

我正在制作手风琴,以便在angular应用程序中使用javascript制作可折叠的div。

如果没有打开,请单击Parent One上的按钮或其他任何父名称。

HTML

<div *ngFor="let item of data">
  <button class="accordion"> {{item.parentName}} </button>
  <div class="panel" *ngFor="let child of item.childProperties">
  <p> {{child.propertyName}} </p>
</div>
</div>

Ts

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

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {

  data: any =
    [
      {
        "parentName": "Parent One",
        "childProperties":
          [
            { "propertyName": "Property One" },
            { "propertyName": "Property Two" }
          ]
      },
      {
        "parentName": "Parent Two",
        "childProperties":
          [
            { "propertyName": "Property Three" },
            { "propertyName": "Property Four" },
            { "propertyName": "Property Five" },
          ]
      },
      {
        "parentName": "Parent Three",
        "childProperties":
          [
            { "propertyName": "Property Six" },
            { "propertyName": "Property Seven" },
            { "propertyName": "Property Eight" },
          ]
      }
    ]

  ngOnInit() {
    var acc = document.getElementsByClassName("accordion");
    var i;

    for (i = 0; i < acc.length; i++) {
      acc[i].addEventListener("click", function () {
        this.classList.toggle("active");
        var panel = this.nextElementSibling;
        if (panel.style.maxHeight) {
          panel.style.maxHeight = null;
        } else {
          panel.style.maxHeight = panel.scrollHeight + "px";
        }
      });
    }
  }

}

注意::由于我是angular的新手,因此我使用javascript方式制作了它。.因此,请帮助我使用 pure angular和Typescript .. < / p>

正在工作 stackblitz https://stackblitz.com/edit/angular-lp3riw

您可以在演示中看到父按钮是可见的,但是如果您单击该按钮,则它不会展开。

下面还在工作的可折叠按钮中列出了静态值。

如何使用角度和打字稿方式(无需任何第三方或jquery)使给定的可折叠手风琴像给定的stackblitz静态值。

2 个答案:

答案 0 :(得分:6)

将功能保留在ngAfterViewInit中,而不要使用ngOnInit。查看更新后的stackblitz

问题在于,在ngOnInit上,视图未完全绘制,并且没有获得要绑定该函数的所有元素。

ngAfterViewInit() {
    var acc = document.getElementsByClassName("accordion");
    var i;

    for (i = 0; i < acc.length; i++) {
      acc[i].addEventListener("click", function () {
        this.classList.toggle("active");
        var panel = this.nextElementSibling;
        if (panel.style.maxHeight) {
          panel.style.maxHeight = null;
        } else {
          panel.style.maxHeight = panel.scrollHeight + "px";
        }
      });
    }
  }

使用角度,如下所示。

在按钮上保留单击功能,并将属性isActive绑定到相应的数组元素。然后根据isActive的值为true / false来显示/隐藏手风琴。

<div *ngFor="let item of data;let i = index;">
  <button class="accordion" (click)="toggleAccordian($event, i)"> {{item.parentName}} </button>
  <div class="panel" *ngFor="let child of item.childProperties" hide="!item.isActive">
  <p> {{child.propertyName}} </p>
</div>
</div>


toggleAccordian(event, index) {
      var element = event.target;
      element.classList.toggle("active");
      if(this.data[index].isActive) {
        this.data[index].isActive = false;
      } else {
        this.data[index].isActive = true;
      }      
      var panel = element.nextElementSibling;
      if (panel.style.maxHeight) {
        panel.style.maxHeight = null;
      } else {
        panel.style.maxHeight = panel.scrollHeight + "px";
      }
  }

答案 1 :(得分:0)

Stackblitz更新仅显示childProperties项中的第一个元素,因此,如果在p标签上应用* ngFor,您将获得childProperties的所有元素

<p *ngFor="let child of item.childProperties"> {{child.propertyName}} </p>