2014-05-15 64 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