Ich binde eine Liste von Objekten an eine select
mit Knockout. Objektklasse kann beliebig viele Eigenschaften haben
Das funktioniert einwandfrei und ich kann viewModel.selectedCity().Name
oder viewModel.selectedCity().Value
zum Laden von untergeordneten Elementen verwenden.
Mein Problem ist die jQuery-Validierung. Wenn ich die Anweisung wie oben angegeben belasse, setzt jQuery den Fehler auch nach der Auswahl nicht zurück.
Ich habe es durch Angabe von optionsValue
in der Bindung behoben, aber dann liefert selectedCity
den skalaren Wert und nicht das gesamte Objekt. Irgendeine Idee, wie man das Objektverhalten erhält oder die Validierung anders macht?
Der Fehler bleibt dort, wenn optionsValue
nicht angegeben ist:
Hier ist mein Object Watch auf selectedCity
:
Hier ist eine Objektüberwachung in selectedCity
, wenn optionsValue
angegeben ist:
Das Problem besteht darin, dass die Elemente option
ihren Wert auf "" setzen, wenn Objekte als Wert behandelt werden. Die jQuery-Validierung schlägt deshalb fehl. Sie könnten eine Binding- oder Wrapper-Bindung an die options
-Bindung schreiben, die durchläuft, und sie nur auf einen Wert setzen, aber ich denke nicht, dass es vorzuziehen ist, diese Route zu gehen.
Eine vernünftige Option besteht darin, den Wert zu speichern und ein abhängiges Observable zu verwenden, um das aktuell ausgewählte Objekt darzustellen.
Es wäre wie:
%Vor%Mit einer Bindung wie:
%Vor%Beispiel hier: Ссылка
Ganz einfache Lösung wäre, den Optionen optionsAfrerRender zur Optionsbindung hinzuzufügen. Angenommen, im Objekt 'selectedCity' gibt es ein Feld 'cityId', das Sie einem Optionswert zuweisen können. Überprüfen Sie anhand Ihres Beispiels die folgende Lösung:
%Vor%Mit diesem Ansatz können Sie sowohl die Knockout-Optionen binden als auch die Jquery-Validierung durchführen.
Die obige Antwort funktioniert mit einem Vorbehalt. Die erste Auswahlwertgrenze ("- Select the city--") ist nicht definiert und verursacht einen Fehler.
Wenn Sie den Code ändern, um damit umzugehen, wird es funktionieren.
%Vor%Hinweis: Ich habe alles aus dem ViewModel entfernt, mit Ausnahme der Methode setOptionValue.
%Vor%
Um Roberts Antwort zu erweitern, können wir die Hilfsfunktion für jedes Dropdown im Ansichtsmodell verwenden, unabhängig von der Kontextdatenbindung, indem dem Benutzer ermöglicht wird, eine Zeichenfolge für die richtige Eigenschaft einzugeben:
JS
%Vor%HTML
%Vor%Tags und Links asp.net-mvc knockout.js jquery asp.net jquery-validate