複雑にしないでおく!デフォルトで 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)
- 成功と失敗のコールバックを伴う Ajax 呼び出し
- コールバックで行う
vm.loading(false)
Knockout がオーバーレイの可視性を処理します。
デモについては、このフィドルを参照するか、このスタック スニペットを確認してください。
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>