【发布时间】:2013-11-11 18:53:56
【问题描述】:
我通过将其可见性绑定到名为 waiting 的 observable 来在我的 UI 上显示或隐藏“正在加载”指示器,其定义如下:
// 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 observable,因为我不希望出现加载消息,除非请求花费很长时间(在这种情况下 > 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 立即更新?
【问题讨论】:
标签: knockout.js computed-observable