Метод 1. Вы можете вызвать функцию родительского компонента (OuterComponent) из дочернего компонента (InnerComponent) с помощью @ Output.
OuterComponent HTML:
<MiddleComponent (updateOuterComponent)="parentFunction($event)" />
OuterComponent TS:
export class OuterComponent implements OnInit {
constructor() {}
ngOnInit() {}
parentFunction(para) {
console.log(para);
// operations you want to do in parent component
}
}
MiddleWare HTML:
<InnerComponent (updateMiddleComponent)="middleFunction($event)" />
MiddleComponent TS:
export class MiddleComponent implements OnInit {
@Output() updateOuterComponent = new EventEmitter();
constructor() {}
ngOnInit() {}
middleFunction(para) {
this.updateOuterComponent.emit(para);
}
}
InnerComponent HTML: это может быть все, что вы хотите написать
InnerComponent TS:
export class InnerComponent implements OnInit {
@Output() updateMiddleComponent = new EventEmitter();
constructor() {}
ngOnInit() {}
updateMiddleAndParent(para) {
this.updateMiddleComponent.emit(para);
}
}
Как только вы вызываете updateMiddleAndParent
функцию из внутреннего компонента с помощью эмиттера, это вызовет middleFunction
в MiddleComponent. После запуска middleFunction, аналогичным образом middleFunction будет запускать parentFunction с помощью эмиттера.
Метод 2: Вам необходимо создать службу и использовать ее для вызова родительской функции:
DataService:
import {BehaviorSubject} from "rxjs/BehaviorSubject"
export class DataService {
private state$ = new BehaviorSubject<any>('initialState');
changeState(myChange) {
this.state$.next(myChange);
}
getState() {
return this.state$.asObservable();
}
}
вызов DataService как в InnerComponent, так и в OuterComponent: в вызове DataService OuterComponent и вызове getState()
это будет возвращать наблюдаемое всякий раз, когда значение изменяется, вы можете любую функцию, использующую данные, переданные в наблюдаемом ответе.
В InnerComponent вызовите DataService и используйте changeState()
для изменения значения.
после того, как значение будет изменено в DataService, тогда в родительском компоненте значение будет изменено по мере того, как вы подписаны на наблюдаемое, вы будете получить обновленные данные оттуда, вы можете вызвать любую функцию в родительском.