バインディングハンドラーでクリックイベントをキャプチャする必要があります。
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)});
</ p>
実例は次のとおりです。
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:そこで述べたように(FIR55TORMによる編集の提案、申し訳ありませんが、レビューするには遅すぎるため、この完全に正しい編集を承認できません):jQuery 1.10.xを使用している場合は、アクセスするためにアンダースコアを追加する必要があります'data'オブジェクトは次のようになります。
var events = $._data(element, "events");
jQuery 1.10.xのフィドルを改訂:http://jsfiddle.net/nickolsky/kp74u/41/