我已经建立了一个系统,我有一个用户界面,每个修改必须发送一个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标志内更新?
嗯,我*有点*了解你的问题,我同情,但没有更接近一个小repro的东西,我们很难帮助你。恐怕你不得不朝着那个方向努力,或者你可能会更好地避免橡皮擦(或者使用一个合作伙伴/朋友,这也可能起作用)来解决这个问题。 – Jeroen
@Jeroen是的,明白这一点。当时正处于部署阶段,并且当时无法轻松获取源代码,但我也试图理解该理论,而不是解决方案,这就是为什么我发布了我的方法而不是代码 – Ian