2013-08-29 47 views
4

我有一個使用knockout.js和jQuery Mobile構建的單頁web應用程序。如何在knockout.js初始化期間顯示「加載程序」?

視圖模型初始化(即ko.applyBindings()函數)大約需要7-8秒。在此期間,該頁面顯示爲空白。

$(document).ready(function() { 
    ko.applyBindings(viewModel); 
}) 

有沒有一種方式來展現JQM裝載機的同時,或顯示一種「閃屏」,給予用戶反饋的「頁面加載」?

請注意,在我看來,@Jeroen提出的解決方案與jQuery Mobile的默認頁面轉換一起也很好,至少我可以看到in this jsfiddle

說實話,@Omar提出的提示在我看來似乎與JQM更好的集成,我將在未來嘗試將這兩個答案與一個可寫的計算可觀察值結合起來,以切換JQM加載器的開啓/關閉。

+0

使用'$ .mobile.loading( '秀')'和'$ .mobile.loading( '隱藏')'。 – Omar

+0

你可以發佈你的viewModel的副本嗎?爲什麼需要這麼長時間?是因爲AJAX嗎? –

+0

@Omar:我試過了,但也許我做錯了什麼,它沒有顯示。 viewModel大約有2000行,但它的在線地址是http://preciso-enjoy.it/ppc/product_configurator.html – user2308978

回答

8

保持簡單!在默認情況下在你的html中顯示一個加載覆蓋圖,但使用某種visible: false綁定。通過這種方式,applyBindings調用完成後,UI將隱藏覆蓋圖。

例如,假設這樣的觀點:

<div id="main"> 
    <div id="loading-overlay" data-bind="visible: loading"></div> 
    Some content<br /> 
    Some content 
</div> 

並假設該視圖模型:

vm = { loading: ko.observable(true) }; 

則調用此:

ko.applyBindings(vm); 

如果出於某種原因需要7秒要加載,將顯示加載覆蓋圖,直到UI被更新。

這種方法是偉大的,如果你有一個客戶端DAL或一些單點運行Ajax調用,因爲你可以按照這個模式:有回調的成功和失敗

  1. vm.loading(true)
  2. Ajax調用
  3. 回調做vm.loading(false)

淘汰賽會爲您處理重疊的知名度。

的演示中看到this fiddle,或看看這個堆棧段:

vm = { loading: ko.observable(true) }; 
 

 
ko.applyBindings(vm); 
 

 
// Mock long loading time: 
 
window.setTimeout(function() { 
 
    vm.loading(false); 
 
}, 5000);
html { height: 100%; } 
 

 
body { 
 
    position: relative; 
 
    height: 100%; 
 
    width: 100%; 
 
} 
 

 
#loading-overlay { 
 
    position: absolute; 
 
    top: 0; left: 0; right: 0; bottom: 0; 
 
    background: url('http://img.cdn.tl/loading51.gif') white no-repeat center; 
 
    opacity: 0.75; 
 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.0/knockout-min.js"></script> 
 

 
<div id="main"> 
 
    <div id="loading-overlay" data-bind="visible: loading"></div> 
 
    Some content<br /> 
 
    Some content<br /> 
 
    Some content<br /> 
 
    Some content<br /> 
 
    Some content<br /> 
 
    <input type='text' value='cant edit me until overlay is gone' /><br /> 
 
    <button>can't press me until overlay's gone!</button><br /> 
 
    Some content<br /> 
 
    Some content<br /> 
 
    Some content 
 
</div>

+0

偉大的提示! 順便說一下,如果有任何理由,我可以問你爲什麼你提出一個自制的解決方案,而不是更標準的解決方案,就像奧馬爾提出的解決方案? – user2308978

+0

我發現現在您的解決方案還具有JQM應用DOM轉換之前工作的優勢。我的意思是,在頁面初始化的初始階段,防止未被格式化的元素閃爍也是有用的。 – user2308978

+0

是的,這個解決方案很簡單,並且不依賴jQuery來初始顯示。一個缺點是瀏覽器的支持,特別是IE7可能對絕對定位感到憤怒(儘管對移動瀏覽器不確定)。 – Jeroen

相關問題