2012-06-21 3 views

Antwort

9

Anstatt zu versuchen, Knockout zu zwingen, mit Änderungsereignissen zu arbeiten, können Sie eine Subskription auf der zugrundeliegenden Observablen einrichten. Wie folgt aus: http://jsfiddle.net/EZC9E/1/

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

Vielen Dank für Ihre Antwort. Ich bin mir dieser Lösung bewusst. Ich verwende jedoch eine separate Bibliothek, die ich zu diesem Zweck nicht ändern möchte. –

+1

Schließlich ging ich mit dieser Lösung, denn ehrlich gesagt konnte ich keinen anderen Weg finden, um das gewünschte Ergebnis zu erreichen. Es beinhaltete die Änderung der Bibliothek, die ich nicht mag, aber es funktioniert jetzt und das ist das Wichtigste. –

1

Anstatt die Javascript-Bibliothek zu ändern, man bedenkt, könnte es in eine Gewohnheit Knockout Bindung Verpackung. Möglicherweise müssen Sie ohnehin bereits eine benutzerdefinierte Bindung für Ihre Bibliothek verwenden, insbesondere wenn Sie foreach Bindungen verwenden, die Elemente dynamisch generieren/zerstören.

Sobald Sie die benutzerdefinierte Bindung haben, haben Sie einen sehr bequemen Ort, um 'Änderung' aus zu triggern.

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