Sie müssen in Ihrem Bindungshandler ein Klickereignis erfassen.
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)});
Hier ist ein funktionierendes Beispiel:
http://jsfiddle.net/kp74u/54/
UPDATE 1: Wenn Sie andere Event-Handler nach Knockout-Bindung Handler gebunden müssen verhindern, wurde angebracht, müssen Sie stopImmediatePropagation
an den Ereignishandler hinzuzufügen, zusammen mit preventDefault
.
Beispiel: http://jsfiddle.net/kp74u/55/
UPDATE 2: Wenn Sie alle Event-Handler deaktivieren wollen (zusammen mit Click-Ereignishandler vor Ihrer verbindlichen Handler angebracht, Sie müssen zu 'hacken' die jquery Ereignisse Array). Bitte beachten Sie, dass diese nicht auf andere Versionen von jQuery arbeiten kann (Beispiel verwendet 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
};
});
}
};
Beispiel: http://jsfiddle.net/nickolsky/kp74u/40/
UPDATE 3: Wie erwähnt wurde (suggested edit by FIR55TORM, leider nicht genehmigen kann vollständig korrekt bearbeiten, weil ich bin zu spät zu überprüfen): wenn Sie jQuery 1.10.x verwenden, benötigen Sie einen Unterstrich hinzufügen, um das Objekt ‚Daten‘ zugreifen wie so:
var events = $._data(element, "events");
Revised Geige für jQuery 1.10.x: http://jsfiddle.net/nickolsky/kp74u/41/
Ich habe nur durch das Setzen ihrer onlick Anker-Tags "disabled" zu sehen falsch. Was meinst du mit dem Anker passieren, um es zu "deaktivieren"? – Tyrsius
Nur um sicherzustellen, dass keine Klickereignisse ausgelöst werden. Wenn diese Option aktiviert ist, werden die Klickereignisse wieder aktiviert. –
Als Alternative können Sie die KO-Kommentarlogik verwenden, um nur ein anderes Tag zu erzeugen. Siehe: http://stackoverflow.com/q/15969045/52551 –