【问题标题】:KnockoutJS - how do I debounce clicks?KnockoutJS - 我如何去抖动点击?
【发布时间】:2013-10-06 04:37:41
【问题描述】:

我想更改按下按钮时默认发生的情况 - 我需要防止按钮被双击。

一种选择是将按钮绑定到的函数包装在下划线的 _.once() 或 _.throttle() 中,但最好在堆栈的更高层处理。

所以我发现了这个问题:knockoutjs overriding bindinghandlers 和答案中引用的小提琴 (http://jsfiddle.net/rniemeyer/PksAn/) 并试图用它做点什么。以下是小提琴的原始代码。

(function(){
var originalInit = ko.bindingHandlers.click.init,
    originalUpdate = ko.bindingHandlers.click.update;

ko.bindingHandlers.click = {
    init: function(element, valueAccessor, allBindingsAccessor, viewModel) {
        var wrappedValueAccessor = function() {
            return function(data, event) {
                ko.bindingHandlers.click.preOnClick.call(viewModel, data, event);
                valueAccessor().call(viewModel, data, event);
                ko.bindingHandlers.click.postOnClick.call(viewModel, data, event);
            };
        };

        originalInit(element, wrappedValueAccessor, allBindingsAccessor, viewModel);
    },
    update: originalUpdate,
    preOnClick: function(data, event) {
    },
    postOnClick: function(data, event) {
    }
};
})();

我尝试用 _.throttle() 包装 WrappedValueAccessor,还尝试包装嵌套函数,但结果表明 valueAccessor() 每次都返回一个新函数,我认为这是我应该包装的.

代码在这里:(来自从第 2043 行开始的 knockout-2.2.1.debug.js)

function makeValueAccessor(bindingKey) {
    return function () { return parsedBindings[bindingKey] }
}

这意味着我必须进入淘汰赛的内部,这似乎是错误的。

所以我的问题是,我的想法是正确的还是方法完全错误。有没有更好的方法来做到这一点?

【问题讨论】:

    标签: knockout.js knockout-2.0 debouncing


    【解决方案1】:

    您可以创建一个 debounce 版本的 valueAccessor 返回处理函数并将其存储,然后从 wrappedValueAccessor 函数返回该去抖动版本:

    init: function(element, valueAccessor, allBindingsAccessor, viewModel) {
        var debouncedAccessor = _.debounce(valueAccessor(), 800, true)
        var wrappedValueAccessor = function() {
            return debouncedAccessor;
        };        
        originalInit(element, wrappedValueAccessor, allBindingsAccessor, viewModel);
    },
    

    演示JSFiddle.

    【讨论】:

    • 这很好用,除非点击处理程序不是当前绑定上下文对象的方法。例如,如果你使用click: $root.clickHandlerMethodclick: childObject.clickHandlerMethod,this 指针仍然是绑定的上下文对象,而不是$rootchildObject,这是我认为用户所期望的。
    猜你喜欢
    • 2019-04-18
    • 2017-12-16
    • 1970-01-01
    • 2020-11-23
    • 2014-11-20
    • 2021-11-21
    • 1970-01-01
    • 2017-01-22
    • 1970-01-01
    相关资源
    最近更新 更多