Возможны 2 варианта:
- Использование
@output
(в вашем случае это не очень хороший вариант):
Дедушка
<parent (notifyGrandParent)="grandmaHandleClick($event)">
<parent>
...
grandmaHandleClick(event) {
console.log('grandma knows you clicked')
}
Родительский :
<child (handleClick)="childEvent($event)">
</child>
@Output() notifyGrandParent= new EventEmitter();
childEvent(event) {
this.notifyGrandParent.emit('event')
}
Дочерний элемент правильно реализован в коде, поэтому его можно использовать.
Использование
BehaviorSubject
через
Service
: с таким большим уровнем вложенности вы можете создать некий сервис, такой как
EventService
, а затем создать
BehaviorSubject
, который может быть напрямую подписан GrandParent.Кроме того, чтобы сделать этот
service
более конкретным компонентом, вы можете сохранить эту службу в
module
, который будет иметь 3 других компонента (GrandParent, Parent и Child)
export class EventService{
private childClickedEvent = new BehaviorSubject<string>('');
emitChildEvent(msg: string){
this.childClickedEvent.next(msg)
}
childEventListner(){
return this.childClickedEvent.asObservable();
}
}
, а затем вcomponents
:
ChildComponent
export class ChildComponent{
constructor(private evtSvc: EventService){}
onClick(){
this.evtSvc.emitChildEvent('clicked a button')
}
}
GrandParent
export class GrandComponent{
constructor(private evtSvc: EventService){}
ngOnInit(){
this.evtSvc.childEventListner().subscribe(info =>{
console.log(info); // here you get the message from Child component
})
}
}