angular - 订阅按钮内的角度订阅点击
问题描述
我目前有一个按钮,单击该按钮时我想调用服务:
saveAssignment(formValues) {
if (this.rulesService.validate(3, 1)) {
// continue to save
console.log('trigger save');
this.assignmentService.saveAssignment(formValues).subscribe((data) => {
console.log('saved!');
});
} else {
alert('came in here instead');
}
}
规则服务:
validate(actionId: number, referenceId: number): boolean {
let hasErrors = false;
let result: any;
this.validateRulesAPI(3, 1).subscribe((data) => {
// some logic here will set hasErrors property to true/false
});
return hasErrors;
}
ruleService 我希望它返回一个布尔值,无论它是否验证了参数,这样我就可以重用它,但问题是订单已关闭,因为代码在调用完成之前返回,这是另一种安排方式,所以他们互相等待?所以 rulesService.validate 将等待 bool 返回,然后如果它返回 true,则继续调用 saveAssignments?否则我会看到警报('改为'来到这里')命中,然后验证代码运行。
解决方案
你可以使用switchMap
pipeable 操作符rxjs
来订阅一个内部 observable。
对于验证,您可以返回一个Observable
映射到boolean
相应的:
validate(actionId: number, referenceId: number): Observable<boolean> {
return this.validateRulesAPI(actionId, referenceId).pipe(map(data) => {
// Do the stuff and check for errors
// if has error then ------------> return false
// if does not have error then ---> return true
});
}
然后在saveAssignment
方法中你可以使用switchMap
saveAssignment(formValues) {
this.rulesService.validate(3, 1).pipe(
switchMap((isValid) => {
if(isValid){
return this.assignmentService.saveAssignment(formValues)
}else{
return of(false); // false or whatever the value you want to have
}
})
).subscribe((response) => {
if(response === false){
alert('Invalid'); // alert('came in here instead');
}else{
console.log(response); // response of this.assignmentService.saveAssignment(formValues)
}
})
希望这可以帮助。
推荐阅读
- javascript - 如何在 AG 网格中制作运行总计列
- typescript - 如何列出项目中所有使用的打字稿类型
- json - 使用 GQ/BASH 将 JSON 转换为 CSV
- ios - 反应本机:在TestFlight中显示图像不起作用
- react-native - 反应原生动态平面列表高度
- python - Tkinter 按钮小部件窃听
- sql-server - INSERT 失败,因为以下 SET 选项的设置不正确:使用 BCP 时出现“QUOTED_IDENTIFIER”
- javascript - 当 Axios 发布错误时,DataDog 检测会破坏代码片段
- javascript - PHP - 处理哈希后添加到 URL 的社交跟踪字符串
- node.js - ReactJS/Express Axios POST 返回 CORS 错误或 404 错误