2012-07-26 7 views
10

aktualisiert Hier ist ein jsfiddle zu zeigen, was das Problem ist:Änderungsereignis abfeuern, wenn Knockout View-Modell Eigenschaft

http://jsfiddle.net/boblauer/BgvV4/

Ich versuche, das Change-Ereignis ausgelöst, nachdem ein Textfeld aktualisiert wird. Leider wurde innerhalb der subscribe-Methode der Wert des Textfelds noch nicht aktualisiert. Wenn ich also das Änderungsereignis feststelle, wird es zu früh ausgelöst.

Ich muss das Änderungsereignis auslösen, weil ich Code von Drittanbietern habe, der außerhalb meiner Kontrolle liegt und auf dem Änderungsereignis beruht.

Irgendwelche Vorschläge?

+0

Wird das Änderungsereignis im 3rd-Party-Code festgelegt, oder müssen Sie es nur aufrufen? – Tyrsius

+0

Der Change-Event-Handler ist in 3rd-Party-Code gebunden, und ich muss ihn auslösen, wenn mein View-Modell meinen Textbox-Wert aktualisiert. –

+0

Vielleicht folge ich dir nicht. Wenn Sie den neuen Wert abfangen möchten (den, in den er geändert wurde), ist die subscribe-Methode in Ordnung und in Ihrem Beispiel funktioniert sie. Da ich etwas vermisse, was sind deine erwarteten Ergebnisse? –

Antwort

7

Eine einfache Lösung besteht darin, Ihren Aufruf an $ ("# text1"). Change() in einem setTimeout mit einem Timeout von 0 zu übergeben. Das ist genug, um knockout die (synchrone) Aktualisierung auf den Textboxwert vor dem ausführen zu lassen jquery change handler wird aufgerufen.

ich Ihre Geige gegabelt zu demonstrieren: http://jsfiddle.net/SuRYa/1//

Ist dies etwas, was Sie brauchen, ist eine Menge zu tun, eine bessere Lösung ist wahrscheinlich, dieses Verhalten in einem benutzerdefinierten einzuwickeln Bindung, wo der „update“ Rückruf der Bindung würde das jquery change-Ereignis auf dem aktualisierten Element auslösen.

+0

Keine ideale Lösung, aber ich bin nicht überzeugt, dass es eine ideale Lösung gibt, also denke ich, dass dies meine beste Option sein könnte. Danke für den Vorschlag. –

0

bmode ist richtig, eine benutzerdefinierte Bindung wird es tun. Obwohl diese Antwort ein bisschen spät ist, hier ist die Bindung für den Fall, dass es jedem hilft, diesen Beitrag später zu lesen. Es aktualisiert den Wert des Textfelds mit jQuery - das DOM wird nun aktualisiert, damit Bobs Code von Drittanbietern funktioniert - also wird das Änderungsereignis ausgelöst.

ko.bindingHandlers.valueAndFireChange = { 
    update: function(element, valueAccessor) { 
     var val = ko.unwrap(valueAccessor()); 
     if (val == undefined) return; 
     $(element).val(val); 
     $(element).change(); 
    } 
}; 

Hier ist eine aktualisierte Version von Geige Bob dies in Aktion zeigt:

http://jsfiddle.net/BgvV4/17/

ich die Warnungen geändert console.log, so dass Sie die Konsole benötigen offen die nützlichen Informationen zu sehen .

Verwandte Themen