In fact,我只看到了2个解决方案:
- 使用2个主题/可观察对象:1用于执行,1用于结果
- 使用1个主题/可观察对象:使用subject.next进行通知和subject.complete实现,但在这种情况下,您必须为每个执行重新实例化主题/可观察对象。
1)解决方案1
组件A(父级)订阅resultNextSubject(在“next”方法上)
组件B(子级)订阅nextSubject(在“next”方法上)
在组件A中,当您单击“下一个”按钮时,它调用nextSubject.next来通知组件B进行提交(验证保存)
组件B执行提交并调用resultNextSubject.next()以通知组件A的结果
组件A接收resultNext通知并路由到另一个组件以显示
等等...
组件A(父级)
@Component({
selector: 'pi-xxx',
providers: [xxxService],
templateUrl: './xxx.component.html',
styleUrls: ['./xxx.component.scss']
})
export class xxxAComponent implements OnInit, OnDestroy {
constructor(private router: Router, private xxxService: XxxService) {}
ngOnInit() {
...
this.subscription = this.xxxService.getNextResultObservable().subscribe((value) => {
..routing..);
}
}
ngOnDestroy(): void {
this.subscription.unsubscribe();
}
public onClickNext(): void {
...
this.xxxService.executeNext();
}
}
组件B(子组件)
@Component({
selector: 'pi-tab2',
templateUrl: './tab2.component.html',
styleUrls: ['./tab2.component.scss']
})
export class Tab2Component implements OnInit, OnDestroy {
private subscription:Subscription;
constructor(private xxxService:XxxService) { }
ngOnInit() {
this.subscription = this.xxxService.getNextObservable().subscribe(value => {
this.submit();
});
}
ngOnDestroy(): void {
this.subscription.unsubscribe();
}
submit() {
...
this.xxxService.getNextResultSubject().next();
}
}
2) 解决方案2
组件A(父级)订阅nextSubject(在'complete'方法中)
组件B(子级)订阅nextSubject(在'next'方法中)
在组件A中,当您单击“下一个”按钮时,它调用nextSubject.next通知组件B进行提交(验证保存)
组件B执行提交并调用nextSubject.complete()通知结果给组件A
组件A接收到resultNext(完成)通知并路由到另一个组件以进行显示。但是,在路由之前,组件A必须重新实例化主题及其可观察对象。
组件A
ngOnInit() {
.... init
}
public onClickNext(): void {
....
this.xxxService.nextObservable().subscribe({
complete: () => {
this.xxxService.nextSubject = new Subject();
this.xxxService.nextObservable = this.xxxService.nextSubject.AsObservable()
....routing...
}}
);
this.xxxService.executeNext();
}
}
组件 B
ngOnInit() {
this.subscription = this.xxxService.getNextObservable().subscribe(value => {
this.submit();
});
}
ngOnDestroy(): void {
this.subscription.unsubscribe();
}
submit() {
...
this.xxxService.getNextSubject().complete();
}
pipe()
到Observable中,所以您想要执行的任何操作都可以在订阅之前完成。这不是最简单的方法吗? - thomi