我有一个使用knockout.js和jQuery Mobile构建的单页网络应用程序。
视图模型初始化(即ko.applyBindings()
函数)大约需要7-8秒。在此期间,页面显示为空白。
$(document).ready(function () {
ko.applyBindings(viewModel);
})
有没有办法在此期间显示JQM加载程序,或者显示一种“启动画面”,以便向用户提供“页面正在加载”的反馈?
请注意,在我看来,@ Jeroen提出的解决方案与jQuery Mobile的默认页面转换一起也很好,至少我可以看到in this jsfiddle。
老实说,@ Omar提出的提示在我看来与JQM有更好的集成,我将在未来尝试将两个答案结合起来,并使用可写的计算observable来打开/关闭JQM加载器。 / p>
答案 0 :(得分:9)
保持简单!默认情况下在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调用的单点,这种方法很棒,因为你可以遵循这种模式:
vm.loading(true)
vm.loading(false)
Knockout将为您处理叠加层可见性。
有关演示的信息,请参阅this fiddle,或查看此Stack Snippet:
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>