2017-06-14 26 views
0

我使用http observable获取数据。加载数据并等待响应时,我想禁用提交按钮。Angular 2 - http - Observable - 启动/停止/运行状态

当前我已经在每个组件/表单上实现了状态码,以便在调用subscribe方法之前将状态设置为正在运行,并且如果响应存在,则禁用运行标志。

问题是我必须对每个组件/表单执行此检查。我想用一个模型将observable包装起来,在请求发出前设置状态信息。

什么是最好的方法?在发出请求之前,我没有找到解决方案来添加函数。 Observable之前没有功能。我也尝试连接两个Observables。第一个仅用于表示第二个Observable正在启动。

有没有一种简单的方法来以抽象的方式来聆听observable的开始。我想换HTTP服务,以保持(启动/停止/运行/ ...)指出...

编辑1:

这里是什么即时通讯目前正在做一些伪代码。我在每个由按钮触发的observable上添加了这个状态持有者。我想删除这个重复的代码。

this.mystateHolder.start(); // sets running;error,success to false 
this.myservice.updateSomething(mydata).subscibe(
    ok => mysateHolder.stop(false) // sets success to true and running to false 
    error => mystateHOlder.stop(true, error) // sets error to true and running to false 
) 
<button [disabeld]="mystateHolder.isRunning()"></button> 
<span *ngIf="mystateHolder.hasErrors()">mystateHolder.getErrorMessage()</span> 

目标伪代码(也许):

const state = this.myservice.updateSomething(mydata).state() 
state.subscribe(); 
console.log(state.hasErrors()) 
console.log(state.isRunning()) 
console.log(state.success()) 

回答

0

一件事你可以做的是让你去期望的状态之前,你需要的电话。这可以在您使用resolve参数的路由器中完成。 (https://angular.io/api/router/Resolve如果您使用角度路由器,UI路由器也提供这一点)。 我能想到的另一件事是只检查数据是按钮的标签与[关闭]属性一样,可供选择:

<button [disable]="data === null">Submit</button> 

或其他一些检查以适合你的问题。

+0

我已更新我的示例(编辑1)。如果我检查数据,那么它也是另一种状态检查。如果没有数据返回会怎么样?我必须一次又一次地对所有特定用例的每个可观察对象执行操作,但每次都是一样的。 – meleagros