Das Problem ist meiner Meinung nach checked erwartet einen String “true”https://stackoverflow.com/”false”. Meine Frage ist also, wie bekomme ich diese 2-Wege-Bindung mit dieser Benutzeroberfläche und diesem Modell?
Für Knockout-Versionen> = 3.0 finden Sie in Natans Antwort eine einfachere Lösung als in der akzeptierten Antwort vorgeschlagen.
– Markus Pscheidt
7. Februar 2014 um 20:37 Uhr
Ich weiß, dass dies ein alter Thread ist, aber ich hatte das gleiche Problem und fand eine viel bessere Lösung, die wahrscheinlich zu Knockout hinzugefügt wurde, nachdem diese Frage offiziell beantwortet wurde, also überlasse ich es einfach Leuten mit demselben Problem.
Derzeit besteht keine Notwendigkeit für Extender, benutzerdefinierte Bindungshandler oder Berechnungen. Geben Sie einfach eine “checkedValue”-Option an, die anstelle des HTML-Attributs “value” verwendet wird, und damit können Sie jeden Javascript-Wert übergeben.
Ja, danke, ich habe auf 3.0.0 aktualisiert und jetzt ist es da. Ich muss meine booleschen Werte immer noch in einen String packen, weil der Servercode diese erwartet hat 😉
– ZiglioUK
22. Januar 2014 um 21:15 Uhr
Gute Infos. Zwei zusätzliche Punkte: (1) Ich habe festgestellt, dass ich mit Pre-v3.0 Knockout die verwenden konnte value Bindung und dann die checked Bindung (in dieser Reihenfolge), aber mit 3.0 musste ich die verwenden checkedValue Bindung statt der value Bindung. (2) Pre-v3.0 war wählerisch, wenn es darum ging, die value verbindlich vor dem checked Binding korrekt zu funktionieren, daher habe ich das Gefühl, dass die Dinge auch in v3.0 in allen Szenarien besser funktionieren könnten, wenn Sie das setzen checkedValue verbindlich vor dem checked Bindung, wie sie in der zeigen Dokumente.
– Jason Frank
13. Februar 2014 um 0:35 Uhr
@ZiglioNZ Eine Möglichkeit, wie dies fehlschlagen kann, ist, wenn Ihre checked setter (oder vielleicht etwas davon abhängiges) löst einen Fehler aus – dann ist das richtige Kontrollkästchen nicht aktiviert
– Simon_Weaver
4. August 2014 um 0:39 Uhr
Ich verwende Version 3.4 und finde, dass ich immer noch value=”true” und das Obige eingeben muss, damit es funktioniert.
In diesem Fall denke ich, dass es eine gute Option ist, das beschreibbare berechnete Observable zu einem “Sub-Observable” von Ihnen zu machen IsMale beobachtbar. Ihr Ansichtsmodell würde wie folgt aussehen:
Scheint eine tolle Lösung zu sein. Ich verwende das Mapping-Plug-in, um meine VM zu aktualisieren. Kennen Sie es, das ForEditing auf IsMale auslöschen würde?
– CJ
12. April 2012 um 16:32 Uhr
Hier ist eine Alternative, die die berechnete beobachtbare Erstellung in eine benutzerdefinierte Bindung schiebt, sodass Sie sich nicht darum kümmern müssen, sie im Mapping-Plugin zu behandeln: jsfiddle.net/rniemeyer/utsvJ
– RP Niemeyer
12. April 2012 um 17:25 Uhr
+1 zur Verwendung einer Bindung, anstatt ein Observable für jedes Objekt zu erstellen
– Greg Ennis
29. März 2013 um 3:49 Uhr
@RPNiemeyer ist definitiv der richtige Weg.
– Andreas
31. Juli 2013 um 21:15 Uhr
@RPNiemeyer danke! Diese Geige in den Kommentaren hat bei mir funktioniert.
Das einzige Problem, das ich sehe, ist, dass Sie beim Serialisieren von Viewmodel zur Übergabe an den Server Integer in Observable (anstelle von Booleans) erhalten. Sie müssen anrufen vm.IsMale(!!vm.+IsMale()); vor dem Serialisieren von json zum Senden an den Server (falls die Serverseite nicht richtig damit umgehen kann)
– Artjom
12. April 2012 um 16:10 Uhr
Ich denke, Sie haben Recht, aber meine Javascript-Kenntnisse fehlen. Können Sie mir bitte erklären, wie !!+ funktioniert? Ich bin mit dieser Syntax nicht vertraut.
– CJ
12. April 2012 um 16:40 Uhr
@CJ dies konvertiert eine Zeichenfolge oder Zahl in einen booleschen Wert – überprüfen Sie dies jsfiddle.net/nickolsky/6ydLZ wenn string bereits bool ist, wird es als bool behalten
– Artjom
12. April 2012 um 16:46 Uhr
Vielen Dank. Ich finde das auch eine tolle Lösung.
– CJ
12. April 2012 um 17:31 Uhr
Es funktioniert jedoch nicht in beide Richtungen. Die Optionsfelder werden beim Laden nicht überprüft.
– Mikael Östberg
2. Dezember 2013 um 13:27 Uhr
KurtJ
ko.bindingHandlers['radiobuttonyesno'] = {
'init': function (element, valueAccessor, allBindingsAccessor) {
var stateHandler = function (property, allBindingsAccessor, key, value, checkIfDifferent) {
if (!property || !ko.isObservable(property)) {
var propWriters = allBindingsAccessor()['_ko_property_writers'];
if (propWriters && propWriters[key])
propWriters[key](value);
} else if (ko.isWriteableObservable(property) && (!checkIfDifferent || property.peek() !== value)) {
property(value);
}
};
var updateHandler = function () {
var valueToWrite;
if ((element.type == "radio") && (element.checked)) {
valueToWrite = element.value;
} else {
return; // "radiobuttonyesno" binding only responds to selected radio buttons
}
valueToWrite = (valueToWrite === "True") ? true : false;
var modelValue = valueAccessor(), unwrappedValue = ko.utils.unwrapObservable(modelValue); //can be true of false
stateHandler(modelValue, allBindingsAccessor, 'checked', valueToWrite, true);
};
ko.utils.registerEventHandler(element, "click", updateHandler);
// IE 6 won't allow radio buttons to be selected unless they have a name
if ((element.type == "radio") && !element.name)
ko.bindingHandlers['uniqueName']['init'](element, function () { return true });
},
'update': function (element, valueAccessor) {
var value = ko.utils.unwrapObservable(valueAccessor());
value = value ? "True" : "False";
if (element.type == "radio") {
element.checked = (element.value == value);
}
}
};
Verwenden Sie diesen Binder, anstatt dumme ko-berechnete Observables zu erstellen.
Sobald Sie das herausgefunden haben Die anfängliche Übereinstimmung für das Optionsfeld möchte nur mit einer Zeichenfolge übereinstimmen und möchte den Wert auf einen String setzen, Es ist lediglich eine Frage der Konvertierung Ihres Anfangswerts in eine Zeichenfolge. Ich musste das mit Int-Werten bekämpfen.
Nachdem Sie Ihre Observables eingerichtet haben, konvertieren Sie den Wert in eine Zeichenfolge und KO wird von dort aus seine Magie ausführen. Wenn Sie eine Zuordnung mit einzelnen Zeilen vornehmen, führen Sie die Konvertierung in diesen Zeilen durch.
Im Beispielcode verwende ich Json, um das gesamte Modell in einem einzigen Befehl abzubilden. Lassen Sie dann Razor den Wert zwischen den Anführungszeichen für die Konvertierung einfügen.
Für Knockout-Versionen> = 3.0 finden Sie in Natans Antwort eine einfachere Lösung als in der akzeptierten Antwort vorgeschlagen.
– Markus Pscheidt
7. Februar 2014 um 20:37 Uhr