Debe capturar el evento click en su controlador de enlace.
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)});
Aquí está un ejemplo de trabajo:
http://jsfiddle.net/kp74u/54/
ACTUALIZA 1: Si tiene que evitar que otros controladores de eventos consolidados después se adjuntó manejador de unión nocaut, es necesario agregar stopImmediatePropagation
al controlador de eventos junto con preventDefault
.
ejemplo: http://jsfiddle.net/kp74u/55/
ACTUALIZACIÓN 2: Si desea desactivar todos los controladores de eventos (junto con los controladores de eventos de clic adjuntas antes de su controlador de la unión, es necesario 'hackear' la serie de eventos de jQuery). Tenga en cuenta que esto puede no funcionar otras versiones de jQuery (ejemplo utiliza 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
};
});
}
};
ejemplo: http://jsfiddle.net/nickolsky/kp74u/40/
ACTUALIZACIÓN 3: Como se mencionó allí (suggested edit by FIR55TORM, lo siento no puede aprobar esta completamente correcta edición porque soy demasiado tarde para revisar): si está usando jQuery 1.10.x, tendrá que añadir un guión para tener acceso a los objetos de datos '', así:
var events = $._data(element, "events");
Revisado violín para jQuery 1.10.x: http://jsfiddle.net/nickolsky/kp74u/41/
Sólo he visto etiquetas de anclaje "desactivado" configurando sus onlick a falso. ¿Qué es lo que quiere decir querer pasarle al anclaje para "desactivarlo"? – Tyrsius
Solo para asegurarse de que no activa ningún evento de clic, y cuando está habilitado, los eventos de clic se reniervan. –
Como alternativa, puede usar la lógica de comentarios de KO para producir una etiqueta diferente. Consulte: http://stackoverflow.com/q/15969045/52551 –