在这种情况下,我有三个组件:
-OuterComponent
--MiddleComponent
---InnerComponent
我需要通过MiddleComponent将函数从OuterComponent传递给InnerComponent。
值得一提的是,我需要传递的函数确实需要输入:DoSomething(node)
我不知道它是否相关,但我已经将一个NodeTree从OuterComponent传递到MiddleComponent,然后我将NodeTree拆包到一个Node中,并将其传递到InnerComponent。这个节点是我需要用作正在传递的函数的输入的。
因此,我需要能够使用@Input作为传递给InnerCompenent的函数的输入,我认为它需要是@output。
方法1:您可以使用@Output从子组件(InnerComponent(调用父组件函数(OuterComponent(。
外部组件HTML:
<MiddleComponent (updateOuterComponent)="parentFunction($event)" />
外部组件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);
}
}
内部组件HTML:它可以是任何你想写
内部组件TS:
export class InnerComponent implements OnInit {
@Output() updateMiddleComponent = new EventEmitter();
constructor() {}
ngOnInit() {}
updateMiddleAndParent(para) {
this.updateMiddleComponent.emit(para);
}
}
一旦使用发射器从内部组件调用updateMiddleAndParent
函数,就会触发MiddleComponent中的middleFunction
。触发middleFunction后,类似的middleFunction会在发射器的帮助下触发parentFunction。
方法2:您需要创建一个服务并使用它来调用父函数:
数据服务:
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();
}
}
在InnerComponent和OuterComponent中调用DataService:在OuterComponent调用DataService和调用getState()
中,只要值发生变化,就会返回一个可观察的值。您可以使用可观察响应中传递的数据执行任何函数。
在InnerComponent中,调用DataService并使用changeState()
来更改值。
一旦在DataService中更改了值,那么在父组件中,该值将随着订阅observable而更改。您将从中获得更新的数据,您可以调用父组件中的任何函数。