2015-05-14 45 views
0

我有一個頁面綁定到Knockout Viewmodel。當我點擊一個鏈接時,它會加載一些數據並將其顯示得更遠一點。我想在顯示一個加載img的同時將其加載並加載數據,然後在完成時將其隱藏。我有以下代碼(剝離顯示重要部分)。 Ajax調用是不是異步,它被設置爲false其他代碼別人正在使用,所以我不能改變它。問題是「self.Loading(false)」在ajax調用完成之前不會被觸發,所以它看起來完全不會顯示出來。如果我將ajax調用切換到異步,它將按預期工作。所以我想知道爲什麼Ajax調用阻止了可觀察變量,因爲它在它之前被調用,不應該立即觸發。有沒有辦法迫使它立即觸發。使Knockout observable立即適用?

HTML:

<a data-bind="click: GetInfo" href="javascript:;"> 
    <img data-bind="visible: Loading" src="myimg.jpg" alt="Loading" /> 
</a> 

KO:

self.Loading = ko.observable(false); 
self.GetInfo = function() { 
    self.Loading(true); 
    AjaxCall().done(function (data){ 
     self.Loading(false); 
    } 
}; 
+0

就像軼事一樣,上次我看到一個構建在非異步XHR上的Web應用程序時,它是無法解決的,必須從頭開始重寫。 –

回答

3

可觀察和DOM很可能立刻被更新,但你不能看到它,因爲瀏覽器可能不會去繪製屏​​幕。該請求阻止重繪,因爲...它是非異步的。這是您應該而不是發出非異步請求的確切原因。

作爲一種解決方法,您可以嘗試強制事件循環旋轉一次,使用setTimeout和0超時在可觀察的更改後運行可怕的同步請求,但非常嚴肅地說,只是將請求修復爲異步。當您的代碼被阻止時,瀏覽器不保證會執行任何操作(包括運行任何加載動畫)。

+0

謝謝,我個人不是同步請求的粉絲,我相信它最初是爲了得到一個淘汰賽綁定等待,直到數據加載,因爲它沒有綁定,然後改變造成奇怪的閃爍,但這個問題比這個更容易修復。永遠不知道同步阻止重繪認爲它只是阻止了您的頂級代碼。我會看看是否有可能改變它。 – DasBeasto

0

試試這個

<a data-bind="click: GetInfo,valueUpdate: 'keyup'" href="javascript:;"> 
    <img data-bind="visible: Loading" src="myimg.jpg" alt="Loading" /> 
</a> 
+1

wtf確實valueUpdate與點擊事件有關 –

+0

爲了完整起見,我嘗試了它,它確實不起作用,謝謝。 – DasBeasto

相關問題