我已經建立了一個系統,我有一個用戶界面,每個修改必須發送一個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