我有一个在单击按钮后执行的功能。
public function getID()
{
\DB::table('students')->insert([
[
'name' => $row->name,
'project_id' => 1//request()->route('project.show',$item->id)
]
]);
}
getCurrentView()读取有关当前视图的详细信息,然后将其作为参数传递给下一个视图,因此,当我单击“后退”按钮时,我将返回执行操作的视图。
服务执行方法:
async executeAction(action: Action) {
const proceedingReturnView = this.getCurrentView();
this.srv.execute(action, proceedingReturnView);
}
public getCurrentView(): ViewData {
console.log('I am here 1');
const paramMap = this.activatedRoute.snapshot.paramMap;
const queryParamMap = this.activatedRoute.snapshot.queryParamMap;
return ProceedingViewComponent.getCurrentView(paramMap, queryParamMap, 'PODSTAWOWE', false);
}
第一次执行后,一切正常。返回视图详细信息作为callerViewPath和callerViewParams传递。使用应用程序后退箭头后,它将返回到执行操作的位置。
但是当我再次尝试执行它时,两个返回视图参数均为空,并且似乎代码是从execute()方法中的subscription开始的。控制台中的第一个输出是“我在这里2”。
我试图以某种方式取消订阅,但是该服务在应用程序生命周期中始终“存在”。
我几乎是RxJS的入门者。我该如何解决这个问题?
答案 0 :(得分:0)
您需要将subscription
保留在组件中,并在执行onDestroy
时取消订阅。因此,有必要返回Subscription from service
服务:
async execute(a: Action, returnView: any):Promise<Subscription> {
const subscription = this.caseSrv.giveActionCall(
a.id,
callerViewPath,
callerViewParams
)
subscription.subscribe(
wa => {
if (wa.actionType=== 'PORTAL_CHANGE_VIEW') {
console.log('I am here2');
console.log(wa);
this.portalService.changeView(wa.actionName, this.getChangeViewParams(wa));
}
}
);
return subscription;
}
组件代码示例:
private subscription;
ngOnDestroy(){
if(!!this.subscription){
this.subscription.unsubscribe();
}
}
async executeAction(action: Action) {
const proceedingReturnView = this.getCurrentView();
this.subscription = await this.srv.execute(action, proceedingReturnView);
}