В моем angular 6 я выполняю компонентную связь с использованием сервиса:
service.ts
import { Injectable, Inject } from '@angular/core';
import { Subject } from 'rxjs';
//import { Subject } from 'rxjs/Subject';
@Injectable()
export class ComponentCommunicationService {
private notify = new Subject<any>();
/**
* Observable string streams
*/
notifyObservable$ = this.notify.asObservable();
constructor(){}
public notifyOther(data: any) {
if (data) {
this.notify.next(data);
}
}
}
В моем компоненте P, который является родительским, где я проверяю, соблюдено ли определенное условие он должен инициировать вызов службы.
let isRoleFound= true;
if(this.isRoleFound){
this.componentCommunicationService.notifyOther({value:this.isRoleFound,option:'call from menu'});
this.ref.detectChanges();
}
вызов службы в дочернем компоненте C:
import {ComponentCommunicationService} from 'libs/services-module/src/commonservice/componentcommunication.service'
constructor(
private componentCommunicationService:ComponentCommunicationService
) { }
ngOnInit() {
this.componentCommunicationService.notifyObservable$.subscribe(res => {
if (res.hasOwnProperty('option') && res.option === 'call from menu') {
console.log(res.value)
this.isRoldFound= res.value;
}
})
}
Здесь вызов создается из родительского компонента и переходит в жизненный цикл дочернего компонента ngOnInit хук, но в конечном итоге он не go внутри, если l oop и выпрыгивает.
Обратите внимание, что дочерний компонент находится в подменю, как меню, которое появляется только при наведении указателя мыши на элемент меню.