2012-09-24 2 views
6

Ich bin neu im Knockout und versuche zu bekommen, was eine einfache Aufgabe sein sollte. Ich arbeite an einer MVC4 .NET App mit der Absicht, einen Datumsbereich-Picker zu binden, um Ajax-Anforderungen für die Aktualisierung von Highchart-Diagrammdaten zu stellen. Ich benutze Dan Grossmans Bootstrap-Themen-Datumsauswahl und es war bisher großartig (https://github.com/dangrossman/bootstrap-daterangepicker).Verwenden von Knockout.js zum Binden der Bootstrap-Datumsbereichsauswahl und Analysieren des Bereichsinhalts

Das grundlegende Ziel ist es, die Zeitspanne zu beobachten, die dieser jQuery Date Ranger-Picker aktualisiert, und dann knockout zu verwenden, um diesen Wert an einen anderen Teil der App für die Ajax-Anfrage zu übergeben.

Ich habe alles versucht, was ich online finden kann. ValueUpdate: Ändern Sie auf die Spannweite zu einigen jQuery in Knockout, um das gleiche Ziel zu erreichen, eine Subskriptionsfunktion zu verwenden, um den Wert der Spanne vor und nach dem zu beobachten Datumsauswahl wird verwendet. Anscheinend verwendet dies den Event-Handler jQuery .change(), der nur für Eingaben, Selects und Textareas .. not spans gut ist.

Hier ist die Geige von dem, was ich bisher: http://jsfiddle.net/eyygK/9/

jede Hilfe und Eingang zu schätzen wissen.

+0

@JaredFarrish Ich war mir nicht sicher, ob ich eine benutzerdefinierte Bindung erstellen musste, weil ich nur versuche, Änderungen an dieser einzelnen Spanne zu beobachten. – jmkr

+0

Es gibt kein Änderungsereignis für einen Bereich, da ein Bereichswiederholungsupdate normalerweise in JavaScript ausgeführt wird. In diesem Fall sollten Sie Ihre viewModel-Eigenschaft aktualisieren, um den Bereich zu aktualisieren, nicht umgekehrt. Die Ko-Bindungen sind normalerweise für direkte Benutzereingabe in der Benutzeroberfläche (Klicken, Tippen, Senden). – guzart

Antwort

4

Sie müssen nur Ihre currDateRange-Eigenschaft in Ihrem Ansichtsmodell aktualisieren, wenn ein neuer Datumsbereich aktualisiert wird. So

$('#reportrange').daterangepicker({ 
    ..., 
    function (start, end) { 
     var dateRangeText = start.toString('MM/d/yy') + ' - ' + end.toString('MM/d/yy'); 
     vm.currDateRange(dateRangeText); 
    } 
}); 

, wenn Sie Ihren Datumsbereich aktualisieren, wird es melden KO und Knockout aktualisiert alle Orte, an denen es verwendet wird, die span.

Jetzt können Sie die currDateRange abonnieren, und tun Sie Ihre Ajax Anrufe von dort.

self.currDateRange = ko.observable("09/24/12 - 09/24/12"); 
self.currDateRange.subscribe(function(newValue) { 
    $.ajax({...}); 
}); 

Auf diese Weise ist es egal, woher das Update kommt, knockout benachrichtigt alle.

+0

Ich bekomme ['Uncaught TypeError: Objektfunktion ViewModel() {...} hat keine Methode 'currDateRange''] (http://jsfiddle.net/eyygK/12/) in der Chrome-Konsole, aber es registriert die Initiale Öffnen der Datumsauswahl. –

+0

Stellen Sie sicher, dass die ViewModel-Instanz innerhalb des Datumsbereichs sichtbar ist. Ich merke es einfach, aber du hast deine View-Model-Instanz ('vm') genannt. Also anstelle von 'viewModel' (Kleinbuchstaben v) versuche' vm'. – guzart

+0

http://jsfiddle.net/eyygK/13/ –