使用javascript确认敲除点击绑定

Ale*_*sko 13 javascript confirm knockout.js

除非javascript确认对话框返回true,否则我无法弄清楚如何创建不执行valueAccessor的knockout click绑定.

它可能看起来像这样:

<a data-bind="confirmClick: { message: 'Are you sure?', click: someMethod }">Confirmable link</a>
Run Code Online (Sandbox Code Playgroud)

在内部,confirmClick绑定会执行以下操作:

if (confirm(message)) {
   click();
}
Run Code Online (Sandbox Code Playgroud)

我知道我可以通过将confirm(...)代码放在我的viewModel中来解决这个问题,但这似乎不适合放置那种代码.我可能还可以使用jQueryUI或Bootstrap进行这种确认对话,但我想要一些我可以放入任何项目的东西.

我没有运气地搜索互联网.我甚至查看了淘汰赛点击事件的源代码(https://github.com/knockout/knockout/blob/master/src/binding/defaultBindings/event.js),但它看起来并不友好......

任何帮助都将非常感谢!

nem*_*esv 21

您需要创建自定义confirmClick 绑定处理程序,它接收您的消息和单击处理程序并包围确认逻辑:

ko.bindingHandlers.confirmClick = {
    init: function(element, valueAccessor, allBindings, viewModel) {
        var value = valueAccessor();
        var message = ko.unwrap(value.message);
        var click = value.click;
        ko.applyBindingsToNode(element, { click: function () {
            if (confirm(message))
                return click.apply(this, Array.prototype.slice.apply(arguments));
        }}, viewModel);
    }
}
Run Code Online (Sandbox Code Playgroud)

你可以像你描述的那样:

<a data-bind="confirmClick: { message: 'Are you sure?', click: someMethod }">
    Confirmable link</a>
Run Code Online (Sandbox Code Playgroud)

演示JSFiddle.

注意:click.apply如果要保留并将原始click事件处理程序args传递给您自己的单击事件处理程序,则只需要魔术.

  • 很好的答案,代码中的小错误.init的第三个参数是`allBindings`而不是`viewModel`.您的JSFiddle可以正常工作,因为您在最终方法中不使用`vm`参数. (2认同)