2012-06-21 20 views

risposta

9

Piuttosto che cercare di forzare Knockout a lavorare con gli eventi di modifica, è possibile impostare un abbonamento sull'osservabile sottostante. Come questo: http://jsfiddle.net/EZC9E/1/

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

Grazie per la risposta. Sono a conoscenza di questa soluzione. Tuttavia, sto usando una libreria separata che non voglio modificare per questo scopo. –

+1

Alla fine sono andato con questa soluzione perché francamente non riuscivo a trovare un altro modo per ottenere il risultato desiderato. Ha comportato la modifica della libreria che non mi piace, ma funziona ora e questa è la cosa più importante. –

1

Invece di cambiare la libreria javascript, si potrebbe considerare avvolgendolo in un personalizzato Knockout Binding. Potresti già aver bisogno di utilizzare un'associazione personalizzata per la tua libreria in ogni caso, specialmente se stai utilizzando qualsiasi binding foreach che generi/distrugga elementi in modo dinamico.

Una volta ottenuta l'associazione personalizzata, si dispone di un luogo molto comodo per attivare il "cambiamento" da.

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'); 
     }); 
    } 
} 
Problemi correlati