KnockoutJS - how do I debounce clicks?

 avatar
unknown
javascript
2 years ago
1.3 kB
5
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...