2012-06-21 20 views

Respuesta

9

En lugar de intentar obligar a Knockout a trabajar con eventos de cambio, puede configurar una suscripción en el elemento observable subyacente. De esta manera: http://jsfiddle.net/EZC9E/1/

this.text.subscribe(function(newValue) { 
    alert('Text is changing to ' + newValue); 
});   
+2

Gracias por su respuesta. Soy consciente de esta solución. Sin embargo, estoy usando una biblioteca separada que no quiero modificar para este propósito. –

+1

Eventualmente fui con esta solución porque francamente no pude encontrar otra manera de lograr el resultado deseado. Implicaba modificar la biblioteca que no me gusta, pero funciona ahora y eso es lo más importante. –

1

En lugar de cambiar la biblioteca de JavaScript, es posible considerar envolviéndolo en un personalizada Knockout Encuadernación. Es posible que ya necesite usar un enlace personalizado para su biblioteca de todos modos, especialmente si está utilizando cualquier enlace foreach que genere/destruya elementos dinámicamente.

Una vez que tiene el encuadernado personalizado, tiene un lugar muy conveniente para activar el "cambio".

ko.bindingHandlers.jQueryPluginFunctionCall = { 
    init: function (element, valueAccessor, allBindingsAccessor) { 
     // Apply jQuery plugin to textarea 
     $(element).jQueryPluginFunctionCall(); 

     // Subscribe to the value binding of the textarea, and trigger the change event. 
     allBindingsAccessor().value.subscribe(function() { 
      $(element).trigger('change'); 
     }); 

     // Clean up jQuery plugin on dispose 
     ko.utils.domNodeDisposal.addDisposeCallback(element, function() { 
      // This will be called when the element is removed by Knockout or 
      // if some other part of your code calls ko.removeNode(element) 
      $(element).jQueryPluginFunctionCall('destroy'); 
     }); 
    } 
} 
Cuestiones relacionadas