您需要在绑定处理程序中捕获单击事件。
HTML:
<a href="link" data-bind="disableClick: !enabled()">test</a>
<br/><br/><br/>
<input type="checkbox" data-bind="checked: enabled"> enabled
的JavaScript:
ko.bindingHandlers.disableClick = {
init: function (element, valueAccessor) {
$(element).click(function(evt) {
if(valueAccessor())
evt.preventDefault();
});
},
update: function(element, valueAccessor) {
var value = ko.utils.unwrapObservable(valueAccessor());
ko.bindingHandlers.css.update(element, function() {return { disabled_anchor: value }; });
}
};
ko.applyBindings({ enabled: ko.observable(false)});
这里是一个工作示例:
http://jsfiddle.net/kp74u/54/
更新1:如果您需要防止挖空结合处理程序连接后必然其它事件处理程序,您需要添加stopImmediatePropagation
到事件处理程序与preventDefault
一起。
例如:http://jsfiddle.net/kp74u/55/
更新2:如果你想禁用所有的事件处理程序(与你的绑定处理程序前附加点击事件处理一起,你需要“破解” jQuery的事件阵列)。请注意,这可能无法正常工作的jQuery的其他版本(例如使用1.7):
ko.bindingHandlers.disableClick = {
init: function(element, valueAccessor) {
$(element).click(function(evt) {
alert('test before');
});
$(element).click(function(evt) {
if (valueAccessor()) {
evt.preventDefault();
evt.stopImmediatePropagation();
}
});
//begin of 'hack' to move our 'disable' event handler to top of the stack
var events = $.data(element, "events");
console.log(events);
var handlers = events['click'];
if (handlers.length == 1) {
return;
}
handlers.splice(0, 0, handlers.pop());
//end of 'hack' to move our 'disable' event handler to top of the stack
$(element).click(function(evt) {
alert('test after');
});
},
update: function(element, valueAccessor) {
var value = ko.utils.unwrapObservable(valueAccessor());
ko.bindingHandlers.css.update(element, function() {
return {
disabled_anchor: value
};
});
}
};
例如:http://jsfiddle.net/nickolsky/kp74u/40/
更新3:正如有提到(suggested edit by FIR55TORM,对不起,不能完全同意这个正确的编辑,因为我来不及审查):如果你使用jQuery 1.10.x,你将需要添加下划线来访问“数据”对象,像这样:
var events = $._data(element, "events");
修订捣鼓jQuery的1.10.x:http://jsfiddle.net/nickolsky/kp74u/41/
我只是通过他们的点击数设置为可见锚标记 “已禁用”假。你的意思是什么意思是要发生在主播“禁用”它? – Tyrsius
只是为了确保它不触发任何点击事件,并且启用时,点击事件是可修改的。 –
作为一种替代方法,您可以使用KO注释逻辑来生成不同的标签。请参阅:http://stackoverflow.com/q/15969045/52551 –