Событие Emit and Catch в угловых компонентах - PullRequest
0 голосов
/ 06 февраля 2019

Я создал следующий аккордеонный компонент Angular 7 Пример SlackBlitz :

export class AccordionComponent {

  @ContentChildren(PanelComponent) panels: QueryList<PanelComponent>;

  ngAfterContentInit() {
    this.panels.forEach((panel) => {panel.active = false;});
  }

  onReset(panel: PanelComponent) {
    this.panels.toArray().forEach(panel => panel.active = false);
  }

} 

PanelComponent выглядит следующим образом:

export class PanelComponent {

  @Input() active: boolean;
  @Input() title: string;

  @Output() reset: EventEmitter<PanelComponent> = new EventEmitter();

  toggle() {
    this.active = !this.active;
    if (this.active)
      this.reset.emit(this);
  }

}

Когда я открываю Panel Iнужно закрыть все остальные панели ...

Моя идея для решения этой проблемы заключается в следующем:

  1. Излучение события в функции переключения при установке active = true;Я полагаю, мне нужно передать саму панель в случае?

  2. Поймать это событие в компоненте Accordion.И с пропущенной в событии панелью закройте все остальные панели.

Возможно ли это?Как?

1 Ответ

0 голосов
/ 06 февраля 2019

Вы можете перехватить выходное событие в ваших accordion.component и subscribe к нему.

PanelComponent

import { Component, Input, Output, EventEmitter } from '@angular/core';

@Component({
  selector: 'panel',
  templateUrl: './panel.component.html'
})

export class PanelComponent {

  @Input() active: boolean;
  @Input() title: string;

  @Output() activate = new EventEmitter();

  toggle() {
    this.active = !this.active;
    if (this.active) {
      this.activate.emit();
    }   
  }

}

AccordionComponent

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

import { Subject } from 'rxjs'
import { takeUntil } from 'rxjs/operators'

import { PanelComponent } from './panel.component';

@Component({
  selector: 'accordion',
  templateUrl: './accordion.component.html'
})

export class AccordionComponent {

  @ContentChildren(PanelComponent) panels: QueryList<PanelComponent>;

  destroy$ = new Subject<boolean>();

  ngAfterContentInit() {

    this.panels.forEach((panel) => {
      panel.active = false;
      panel.activate.pipe(
        takeUntil(this.destroy$)
      ).subscribe(() => {
        this.closeAllButPanel(panel);
      })
    });

  }

  ngOnDestroy() {
    this.destroy$.next(true);
    this.destroy$.unsubscribe();
  }

  closeAllButPanel(panelToIgnore: PanelComponent) {
    this.panels.filter(p => p!==panelToIgnore).forEach(panel => panel.active = false);
  }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...