knockout.js KnockoutJS -我如何去反弹点击?

fkvaft9z  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(232)

我想更改按下按钮时默认发生的情况-我需要防止按钮被双击。
一个选项是将按钮绑定到的函数 Package 在_.once()或_.throttle()中,从下划线开始,但如果在堆栈的更高层处理这一点会更好。
于是我发现了这个问题:knockoutjs overriding bindinghandlers和答案中引用的fiddle(http://jsfiddle.net/rniemeyer/PksAn/),并尝试用它做一些事情。下面是fiddle的原始代码。

(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() Package wrapedValueAccessor,我也试着 Package 嵌套函数,但结果是valueAccessor()每次都返回一个新函数,我想这就是我应该 Package 的。
代码如下:(来自knockout-2.2.1.debug.js,从第2043行开始)

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

这意味着我必须进入击倒的内部,这似乎是错误的。
所以我的问题是,我的想法是对的还是方法完全错了,有没有更好的方法?

whlutmcx

whlutmcx1#

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

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

演示JSFiddle

相关问题