Ich versuche, KnockoutJS mit der jQuery-Benutzeroberfläche zu verwenden. Ich habe ein Eingabeelement mit einem Datepicker angehängt. Ich laufe gerade knockout.debug.1.2.1.js
und es scheint, dass das Änderungsereignis niemals von Knockout erfasst wird. Das Element sieht folgendermaßen aus:
<input type="text" class="date" data-bind="value: RedemptionExpiration"/>
Ich habe sogar versucht, den valueUpdate
Ereignistyp zu ändern, aber ohne Erfolg. Es scheint, dass Chrome ein focus
Ereignis verursacht , kurz bevor es den Wert ändert, der IE jedoch nicht.
Gibt es eine Knockout-Methode, die "alle Bindungen neu bindet"? Ich muss den Wert technisch nur ändern, bevor ich ihn an den Server zurücksende. Ich könnte also mit dieser Art von Problemumgehung leben.
Ich denke, das Problem ist die Schuld des Datepickers, aber ich kann nicht herausfinden, wie ich das beheben kann.
Irgendwelche Ideen?
quelle
Hier ist eine Version der Antwort von RP Niemeyer, die mit den hier gefundenen Knockout-Validierungsskripten funktioniert: http://github.com/ericmbarnard/Knockout-Validation
Änderungen betreffen den Änderungsereignishandler, um den eingegebenen Wert und nicht das Datum zuerst an die Validierungsskripte zu übergeben und dann das Datum nur dann auf das beobachtbare Wert zu setzen, wenn es gültig ist. Ich habe auch die validationCore.init hinzugefügt, die für die hier beschriebenen benutzerdefinierten Bindungen benötigt wird:
http://github.com/ericmbarnard/Knockout-Validation/issues/69
Ich habe auch den Vorschlag von rpenrose für eine Unschärfe bei Änderungen hinzugefügt, um einige lästige Datepicker-Szenarien zu beseitigen, die den Dingen im Weg stehen.
quelle
Ich habe einen anderen Ansatz gewählt. Da knockout.js das Ereignis bei Änderung nicht auszulösen scheint, habe ich den Datepicker gezwungen, change () für seine Eingabe aufzurufen, sobald es geschlossen ist.
quelle
Obwohl all diese Antworten mir viel Arbeit erspart haben, hat keine von ihnen für mich voll funktioniert. Nach Auswahl eines Datums wird der gebundene Wert nicht aktualisiert. Ich konnte es nur aktualisieren, wenn ich den Datumswert über die Tastatur änderte und dann aus dem Eingabefeld klickte. Ich habe dies behoben, indem ich den Code von RP Niemeyer mit dem Code von syb erweitert habe, um Folgendes zu erhalten:
Ich vermute, das beobachtbare ($ (Element) .datepicker ("getDate")) zu setzen; Anweisung in seiner eigenen Funktion und Registrierung mit options.onSelect hat den Trick getan?
quelle
onSelect
Funktion überschreiben , wird daschange
Ereignis nichtVielen Dank für diesen Artikel fand ich es sehr nützlich.
Wenn Sie möchten, dass sich der DatePicker genau wie das Standardverhalten der JQuery-Benutzeroberfläche verhält, empfehle ich, dem Element im Handler für Änderungsereignisse eine Unschärfe hinzuzufügen:
dh
quelle
Ich habe dieses Problem gelöst, indem ich die Reihenfolge meiner enthaltenen Skriptdateien geändert habe:
quelle
Wie RP Niemeyer, jedoch bessere Unterstützung von WCF DateTime, Timezones und der Verwendung der DatePicker onSelect JQuery-Eigenschaft.
Genießen :)
http://jsfiddle.net/yechezkelbr/nUdYH/
quelle
Ich denke, es kann viel einfacher gemacht werden:
<input data-bind="value: myDate, datepicker: myDate, datepickerOptions: {}" />
Sie benötigen also keine manuelle Änderungsbehandlung in der Init-Funktion.
In diesem Fall erhält Ihre Variable 'myDate' jedoch nur einen sichtbaren Wert, kein Date-Objekt.
quelle
Alternativ können Sie dies in der Bindung angeben:
Aktualisieren:
quelle
Basierend auf Ryans Lösung gibt myDate die Standard-Datumszeichenfolge zurück, die in meinem Fall nicht die ideale ist. Ich habe date.js verwendet, um den Wert zu analysieren, damit immer das gewünschte Datumsformat zurückgegeben wird. Schauen Sie sich dieses Beispiel an .
quelle
Ich musste meine Daten vom Server wiederholt aktualisieren, stieß jedoch darauf, konnte den Auftrag für die unten stehende Bedarfsfreigabe jedoch nicht vollständig abschließen (mein Datumsformat / Datum (1224043200000) /):
Nachdem das Modell für die Ausgabe korrekt formatiert wurde, habe ich eine Vorlage mit der Dokumentation knockoutjs hinzugefügt :
quelle
Nur wenige Leute fragten nach dynamischen Datepicker-Optionen. In meinem Fall brauchte ich einen dynamischen Datumsbereich - daher definiert die erste Eingabe den Min-Wert der zweiten und die zweite den Max-Wert für die erste. Ich habe es gelöst, indem ich den Handler des RP Niemeyer erweitert habe. Also zu seinem Original:
Ich habe zwei weitere Handler hinzugefügt, die den Optionen entsprechen, die ich ändern wollte:
Und habe sie so in meiner Vorlage verwendet:
quelle
Die Verwendung von benutzerdefinierten Bindungen in früheren Antworten ist nicht immer möglich. Das Aufrufen
$(element).datepicker(...)
dauert einige Zeit, und wenn Sie beispielsweise einige Dutzend oder sogar Hunderte von Elementen haben, mit denen Sie diese Methode aufrufen können, müssen Sie dies "faul" tun, dh auf Anfrage.Beispielsweise kann das Ansichtsmodell initialisiert werden, wobei das
input
s in das DOM eingefügt wird, aber die entsprechenden Datumsauswahl wird nur initialisiert, wenn ein Benutzer darauf klickt.Also, hier ist meine Lösung:
Fügen Sie eine benutzerdefinierte Bindung hinzu, mit der beliebige Daten an einen Knoten angehängt werden können:
Verwenden Sie die Bindung, um das für den
input
Wert von ' verwendete Observable zu ermitteln :Verwenden Sie zum Initialisieren des Datepickers die folgende
onSelect
Option:Auf diese Weise wird jedes Mal, wenn ein Benutzer das Datum mit der Datumsauswahl ändert, auch das entsprechende beobachtbare Knockout aktualisiert.
quelle