UI で「読み込み中」インジケーターを表示または非表示にするには、その可視性を、waiting
次のように定義されている名前付きのオブザーバブルにバインドします。
// Viewmodel
var outstandingRequests = ko.observable(0);
// true if any requests are outstanding
var waiting = ko.computed(function() {
return outstandingRequests() > 0;
}.extend({ throttle: 500 });
// These are called when AJAX requests begin or end
function ajaxBegin() {
outstandingRequests(++outstandingRequests());
}
function ajaxEnd() {
outstandingRequests(--outstandingRequests());
}
<!-- View -->
<div data-bind="visible: waiting">Please wait, loading...</div>
waiting
アプリケーションの知覚速度を上げるために、リクエストに時間がかかる場合 (この場合は 500 ミリ秒以上) でない限り、読み込みメッセージを表示したくないため、オブザーバブルを調整しています。問題は、実行時間の長いリクエストが終了すると、さらに 500 ミリ秒が経過するまで読み込みインジケーターが消えないことです。代わりに、最後の未処理のリクエストが終了したら、すぐwaiting
に false に切り替えたいと思います。
を使用して最初に修正を試みましたvalueHasMutated()
が、更新はまだ遅れています。
function ajaxEnd() {
outstandingRequests(--outstandingRequests());
// If that was the last request, we want the loading widget to disappear NOW.
outstandingRequests.valueHasMutated(); // Nope, 'waiting' still 500ms to update :(
}
waiting
スロットル拡張機能をバイパスして、強制的にすぐに更新するにはどうすればよいですか?