Angular 4 поднять необработанное событие для родителя
У меня есть эта структура внутри основного компонента администратора турнира
админ-tournament.component.html:
<fixture-league></fixture-league>
Светильник-league.component.html
<md-tab-group>
<md-tab *ngFor="let f of fixture" label="{{ f.date | date }}">
<match *ngFor="let m of f" [match]="m"></match>
</md-tab>
</md-tab-group>
match.component.html
<team [team]="match.local_team" (click)="onLocalClick.emit()"></team>
<ul>
<li (click)="onDateClick.emit()">{{ match.date | date:"HH:mm"}}</li>
<li (click)="onResultClick.emit()">{{ match.result | myResultPipe }}</li>
<ul>
<team [team]="match.visitor_team" (click)="onVisitorClick.emit()"></team>
Я хочу обработать события щелчка, которые генерируются в MatchComponent внутри AdminTournamentComponent, а не в FixtureLeagueComponent (потому что я хочу изменить поведение других "TournamentComponents", но сохранить структуру FixtureComponent).
Есть ли возможность поднять необработанные события для родителя "fixture-league", например:
<fixture-league (onDateClick)="doSomething()"></fixture-league>
Если нет, как я могу избежать создания тех же источников событий на FixtureComponent, но обрабатывать эти события на AdminTournamentComponent?
1 ответ
При работе с несколькими уровнями компонентов обычно проще перенести обработку событий на выделенный сервис. Каждый компонент может затем внедрить этот сервис и либо подписаться на событие, либо выдать ему какое-то значение.
import { EventEmitter, Injectable } from '@angular/core';
@Injectable()
export class MyEventService {
private emitter = new EventEmitter<any>();
public subscribe(callback: Function): void {
this.emitter.subscribe(callback);
}
public emit(value: any = {}): void {
this.emitter.emit(value);
}
}
Затем внедрите такой сервис и используйте его:
constructor(public eventService: MyEventService) {}
// emitting
<team [team]="match.local_team" (click)="evetService.emit('localClick')"></team>
// subscribing
ngOnInit() {
this.eventService.subscribe(type => { console.log(type); });
}