[英]Observable not triggered when using asObservable() with Subject in Angular?
我有一个向用户显示表单的组件。 一旦用户在该表单上选择了“提交”按钮,我想触发向后端的http.post请求
我想和他一起使用BehaviorSubject和.asObservable()。 异步管道来实现这一点。
我在PreOrderComponenT
组件ts文件中进行了以下设置:
preOrder$ = this.preOrderService.preOrder$;
onSubmit() {
console.log(this.preOrderForm);
const preOrderForm: PreOrderForm = {
firstName: this.preOrderForm.value.firstName,
lastName: this.preOrderForm.value.lastName,
phoneNumber: this.preOrderForm.value.phoneNumber,
email: this.preOrderForm.value.email,
orderDetails: {
quantity: this.preOrderForm.value.orderDetails.quantity,
size: this.preOrderForm.value.orderDetails.size,
gearItemId: this.gearItem.id
},
contactPreference: {
cellOrEmail: this.preOrderForm.value.contactPreference.cellOrEmail
}
};
this.preOrderService.preOrderGearItem(preOrderForm);
}
在PreOrderComponent
中,模板中包含以下内容:
<ng-container *ngIf="preOrderService.preOrder$ | async as preOrderItem">
<div> TEST </div>
</ng-container>
在PreOrderService
我具有以下内容:
preOrderAction: BehaviorSubject<PreOrderForm> = new BehaviorSubject<
PreOrderForm
>(null);
preOrder$ = this.preOrderAction.asObservable().pipe(
switchMap((preOrderForm: PreOrderForm) => {
console.log("PreORderTriggered");
return this.preOrderGearItemAsync(preOrderForm);
})
);
preOrderGearItem(preOrderForm: PreOrderForm) {
console.log("Pre order form is:", preOrderForm);
this.preOrderAction.next(preOrderForm);
}
preOrderGearItemAsync(preOrderForm: PreOrderForm): Observable<PreOrderForm> {
if (preOrderForm === undefined) {
return of(null);
}
return this.http
.post<PreOrderForm>(
`${this.merchandiseUrl}/${
preOrderForm.orderDetails.gearItemId
}/pre-order`,
JSON.stringify(preOrderForm),
this.headers
)
}
问题是我无法触发http请求。 我不确定自己在做什么错。
您的代码正在“运行”,您可以通过以下堆栈闪电看到: https ://stackblitz.com/edit/angular-nm5pcd
但是,我能否强调两点,并建议您改进一下?
1)在服务初始化时立即调用http请求(即使没有提交)
发生这种情况是因为BehaviourSubject
为“ null”的第一个值,并且因为=== undefined
应该为=== null
。 甚至更好,您可以使用filter
运算符。
preOrder$ = this.preOrderAction.asObservable().pipe(
filter((preOrderForm: PreOrderForm) => !!preOrderForm),
switchMap((preOrderForm: PreOrderForm) => {
return this.preOrderGearItemAsync(preOrderForm);
})
);
2)您也可以考虑另一种方式来调用您的帖子请求。
a)解决方案A
保持非常简单。 因此,只需从您的组件中调用service.preOrderGearItemAsync
,进行订阅,检索结果并将其显示。
this.preOrderService.preOrderGearItemAsync(preOrderForm).subscribe(response => {
this.result = response;
});
b)解决方案B
如https://stackblitz.com/edit/angular-nm5pcd中的NewPreOrderService
中所示。
您的组件可以调用preOrderGearItem
方法,该方法通过订阅来调用http.get
,然后在BehaviourSubject
上调用next
,以使最后的结果可用于您的组件。
希望会有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.