我不知道如何创建一个不执行valueAccessor的敲击点击绑定,除非
javascript确认对话框返回true.
这可能是这样的:
<a data-bind="confirmClick: { message: 'Are you sure?',click: someMethod }">Confirmable link</a>
在内部,confirmClick绑定将执行以下操作:
if (confirm(message)) { click(); }
我知道我可以通过将确认(…)代码放在我的身上来做到这一点
viewmodel,但这似乎不是适当的地方放这种代码.我也可以去做jQueryUI或Bootstrap这样的确认对话框,但是我想要一些可以放在任何项目中的东西.
我没有运气扫过互联网..我甚至看到了基因敲击的点击事件(https://github.com/knockout/knockout/blob/master/src/binding/defaultBindings/event.js)的源代码,但它看起来不友善…
任何帮助,将不胜感激!
解决方法
您需要创建您的自定义confirmClick
binding handler,它将您的消息和您的点击处理程序包裹在一起,并绕过确认逻辑:
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); } }
你可以像你这样描述:
<a data-bind="confirmClick: { message: 'Are you sure?',click: someMethod }"> Confirmable link</a>
演示JSFiddle.
注意:如果要保留原始点击事件处理程序args并将其传递给您自己的点击事件处理程序,则只需要click.apply magic.