KnockoutJS - how do I debounce clicks?
unknown
javascript
3 years ago
1.3 kB
8
Indexable
// https://github.com/jashkenas/underscore/blob/7342e289aa9d91c5aacfb3662ea56e7a6d081200/underscore.js#L683
var _debounce = function (func, wait, immediate) {
var timeout, result;
return function () {
var context = this, args = arguments;
var later = function () {
timeout = null;
if (!immediate) result = func.apply(context, args);
};
var callNow = immediate && !timeout;
clearTimeout(timeout);
timeout = setTimeout(later, wait);
if (callNow) result = func.apply(context, args);
return result;
};
}
// http://jsfiddle.net/sabrewulf/kHa9H/
// https://stackoverflow.com/a/19093083/4078503
ko.bindingHandlers.debouncedClick = {
'init': function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
var allBindings = allBindingsAccessor(),
wait = allBindings.wait || 350,
immediate = allBindings.immediate || true,
throttled = _debounce(valueAccessor(), wait, immediate),
newValueAccessor = function () {
return throttled;
};
return ko.bindingHandlers.click.init(element, newValueAccessor, allBindingsAccessor, viewModel, bindingContext);
}
};Editor is loading...