knockout.js - KnockoutJS - 如何消除点击次数?

标签 knockout.js knockout-2.0 debouncing

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

一个选项是将按钮绑定(bind)到的函数包装在下划线的 _.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() 包装wrappedValueAccessor,我也尝试包装嵌套函数,但事实证明 valueAccessor() 每次都返回一个新函数,我认为这就是我应该包装的。

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

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

这意味着我必须深入了解 knockout 的内部结构,这似乎是错误的。

所以我的问题是,我的想法是正确的还是方法完全错误。有更好的方法吗?

最佳答案

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

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

演示 JSFiddle .

关于knockout.js - KnockoutJS - 如何消除点击次数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19092128/

相关文章:

mvvm - knockout 页面中的多个 View 模型不起作用

javascript - 从对象循环键动态传递属性引用

javascript - knockoutjs 使用嵌套数组映射自定义对象

javascript - 在 ReactJS 功能组件中实现 Lodash 的去抖动

Swift 结合去抖动而不丢弃值

javascript - 在 Javascript 中缓存去抖函数

javascript - 嵌套模板的 KnockoutJS 绑定(bind)

knockout.js - 订阅包含成员 ko.observable() 的 ko.observableArray()

arrays - 从可观察数组中获取第 n 个项目

javascript - 使用 updateFromJS 会在应该添加值时替换值