#javascript #angular #accordion
Вопрос:
Я пытаюсь создать аккордеон, где вы можете нажимать на каждый аккордеон, но я также хотел бы иметь другую кнопку, при нажатии на которую расширяются или сворачиваются все аккордеоны.
Так что прямо сейчас у меня есть этот .ts
компонент:
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'app-faq',
templateUrl: './faq.component.html',
styleUrls: ['./faq.component.scss'],
})
export class FaqComponent implements OnInit {
accordion1: boolean;
accordion2: boolean;
accordion3: boolean;
accordionAll: boolean;
constructor() { }
ngOnInit() {
}
}
Теперь каждый аккордеон-это просто какой-то CSS, и тогда я могу активировать каждый из них с помощью:
<div class="accordion-header" (click)="accordion1 = !accordion1" [ngClass]="accordion1 ? 'is-active' : ''">Accordion 1</div>
А затем я могу придать ему некоторый стиль и активировать некоторый контент аккордеона в этом конкретном accordion1
состоянии.
Для расширения/сворачивания всего, что у меня сейчас есть, что-то вроде этого:
<div *ngIf="!accordionAll" (click)="accordion1 = true; accordion2 = true; accordion3 = true; accordionAll = true"></div>
<div *ngIf="accordionAll" (click)="accordion1 = false; accordion2 = false; accordion3 = false; accordionAll = false"></div>
Так вот, в каком-то смысле это работает. Но если у меня вдруг появится 20 разных аккордеонов, это будет ужасно. Кроме того, мне не нравится, что мне нужно иметь два дива, так как какая-то анимация (например, значок) не работает так хорошо таким образом.
Итак, мой вопрос: как мне сделать это «правильным» способом, чтобы не было беспорядка со многими аккордеонами, и где я действительно могу развернуть/свернуть все только одной кнопкой ?
Комментарии:
1. Вы можете использовать ngClass вместо использования двухэлементного как для переключенного, так и для не включенного состояния.
<div *ngIf="!accordionAll" (click)="toogleAll(!accordionAll)" [ngClass]="{ activated: accordionAll }"></div>
И дайте немного анимации с дополнительнымactivated
классом.2. Вам действительно следует использовать занятия, это уменьшит вашу работу.
Ответ №1:
Поскольку вы отслеживаете состояние accordionAll
уже, вам не нужно передавать логическое значение методу.
<div (click)="toggleAll()"></div>
toggleAll(): void {
this.accordionAll = !this.accordionAll
this.accordion1 = this.accordionAll;
this.accordion2 = this.accordionAll;
this.accordion3 = this.accordionAll
}
Ответ №2:
Я думаю, что что — то вроде этого сработает.
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'app-faq',
templateUrl: './faq.component.html',
styleUrls: ['./faq.component.scss'],
})
export class FaqComponent implements OnInit {
accordion1: boolean;
accordion2: boolean;
accordion3: boolean;
accordionAll: boolean;
constructor() { }
ngOnInit() {
}
toogleAll() {
this.accordion1 = this.accordionAll;
this.accordion2 = this.accordionAll;
this.accordion3 = this.accordionAll;
this.accordionAll = !this.accordionAll;
}
}
<div *ngIf="!accordionAll" (click)="toogleAll()"></div>
<div *ngIf="accordionAll" (click)="toogleAll()"></div>