Data binding 敲除绑定双击和单击,如果双击则忽略单击

Data binding 敲除绑定双击和单击,如果双击则忽略单击,data-binding,knockout.js,double-click,Data Binding,Knockout.js,Double Click,我有一个绑定到以下ko函数的click事件: self.select = function (entity, event) { var ctrlPressed = false; if (event.ctrlKey) { ctrlPressed = true; } if (!ctrlPressed) { manager.deselectAll(); this.selected(true);

我有一个绑定到以下ko函数的click事件:

    self.select = function (entity, event) {
        var ctrlPressed = false;
        if (event.ctrlKey) { ctrlPressed = true; }
        if (!ctrlPressed) {
            manager.deselectAll();
            this.selected(true);
        } else {
            this.selected() ? this.selected(false) : this.selected(true);
        }
    }
它是这样的:

data-bind="click: select, event: { dblclick: function(){alert('test');}}"
这目前的工作,除了它激发“选择”两次当你双击,这是我不想要的。我尝试了以下操作,但是当我创建singleClick()函数时,我得到一个错误:“ctrlKey不是一个未定义的函数”。所以它没有正确地传递事件。此外,另一个答案中的doubleClick()函数根本不起作用。它在“handler.call”部分给出一个错误,表示未定义处理程序


那么,我怎样才能在单次单击时成功调用ko select函数,而不是在双击时成功调用它呢?

我认为这不是一个真正的问题。您至少有以下两种选择: 1.实现一些自定义逻辑,如果单击已开始处理,则阻止处理 2.完全禁止双击功能。JQuery有一个方便的处理程序:

$(selector).on("dblclick", function(e){
    e.preventDefault();  //cancel system double-click event
});

所以从技术上讲我让它起作用了。这是我的新单键点击功能

ko.bindingHandlers.singleClick = {
    init: function (element, valueAccessor, c, viewModel) {
        var handler = valueAccessor(),
            delay = 400,
            clickTimeout = false;

        $(element).click(function (event) {
            if (clickTimeout !== false) {
                clearTimeout(clickTimeout);
                clickTimeout = false;
            } else {
                clickTimeout = setTimeout(function () {
                    clickTimeout = false;
                    handler(viewModel, event);
                }, delay);
            }
        });
    }
};
这会将viewModel和事件传递给处理程序,以便我仍然可以修改可观察对象并捕获ctrlKey

约束力:

data-bind="singleClick: select, event: { dblclick: function(){alert('test');}}"
问题是,很明显,现在单击一个项目在等待是否是双击时会有延迟。我相信,这是一个固有的和无法解决的问题,因此,尽管从技术上回答了我的问题,但我会考虑完全不同的路径(即,在我的界面中没有双击)