2014-05-15 61 views
0

我已经建立了一个系统,我有一个用户界面,每个修改必须发送一个Ajax请求到服务器(应用业务逻辑)和一组新的UI值送回。此过程不会锁定用户界面,因此您可以“链接”更改并一次执行多个Ajax请求。首先淘汰赛更新递归

我使用的是淘汰赛,显然想阻止递归更新会在这里,所以我所做的就是:

  • 应用自定义的用户到每个观察的项目。
  • 当observable发生更改时,会发出Ajax setFeatures请求。
  • 一旦Ajax的setFeatures请求完成后,一个Ajax getFeatures发生并且数据被返回到一个回调仅当有运行
  • 回调没有额外的Ajax请求设置防止正在取得额外的Ajax setFeatures的标志。
  • 淘汰赛观测值都在这一点上没有更多的Ajax请求应被发送
  • 的标志恢复,以便再次发送Ajax请求设置

我已经注意到的是,第一次遇到这种循环发生(setFeatures,getFeatures)每个撬开观察到触发另一个setFeatures(这在这里停止,并且不递归)。

此初始运行后的任何点的行为与预期相同。这是相当难以共享大量的代码,但我相信这样做的原因是,可能是由于以下几点:

skipUpdate = true; 

// Update each of the knockout fields 
$(data).each(function() { 
    var block = viewModel[this.Block]; 
    var item = block[this.Name] 
    item.control.value(this.Value); // item.control.value is the observable 
}); 

skipUpdate = false; 

是因为JavaScript是单线程的,我会是正确的假设,淘汰赛观测量这段代码执行后更新?还是应该在skipUpdate标志内更新?

+0

嗯,我*有点*了解你的问题,我同情,但没有更接近一个小repro的东西,我们很难帮助你。恐怕你不得不朝着那个方向努力,或者你可能会更好地避免橡皮擦(或者使用一个合作伙伴/朋友,这也可能起作用)来解决这个问题。 – Jeroen

+0

@Jeroen是的,明白这一点。当时正处于部署阶段,并且当时无法轻松获取源代码,但我也试图理解该理论,而不是解决方案,这就是为什么我发布了我的方法而不是代码 – Ian

回答

2

通常情况下,更改后的observable会立即通知其订户,以便任何计算的observable或绑定依赖于observable会同步更新。

为了避免这样的更新,使异步更新,你可以使用rate-limiting observable notifications这是knockoutJS 3.1的新功能,在此之前,有件事,叫throttle extender

+0

有趣的是,我实际上使用了一个不同步可以解释我看到的影响。将检查出来。 – Ian

+0

答案有点倒退,但遇到了问题 - 因为我使用RateLimiter异步更新发生在循环和skipUpdate被设置为false后。 – Ian