我不知道如何创建一个不执行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.