KnockoutJS: ko.ToJSON (dies) funktioniert nicht?
-
27-10-2019 - |
Frage
Das folgende Java-Skript, das das MyViewModel-Objekt mit einer Eigenschaft " text " und einer Funktion " save " definiert.
<script type="text/javascript">
function MyViewModel() {
this.text = ko.observable('');
}
MyViewModel.prototype.save = function () {
alert(this.text()); // Works fine
var data = ko.ToJSON(this); // Error: Object doesn't support this property or method ?
$.ajax({
type: 'POST',
url: '/Person/Save',
data: data,
contentType: 'application/json',
success: function (data) {
alert(data);
}
});
};
</script>
<script type="text/javascript">
$(function () {
var viewModel = new MyViewModel()
ko.applyBindings(viewModel);
});
</script>
Und die folgende Schaltfläche definiert:
<button data-bind="click: save">SAVE</button>
Ergebnis, wenn auf die Schaltfläche geklickt wird:
- Der Zugriff auf eine Eigenschaft mit this.text () funktioniert einwandfrei
- Konvertieren des Java-Skriptobjekts in ein JSON-Objekt: ko.ToJSON (this) funktioniert nicht
und löst einen Fehler aus: "Fehler: Objekt unterstützt diese Eigenschaft nicht oder
Methode "
Wahrscheinlich fehlt etwas Triviales oder ist falsch, aber ich kann es nicht sehen.Irgendwelche Tipps?
Lösung
Knockout verfügt nicht über eine ToJSON
-Methode, sondern über eine toJSON
-Methode:
function MyViewModel() {
this.text = ko.observable('');
}
MyViewModel.prototype.save = function () {
alert(this.text()); // Works fine
var data = ko.toJSON(this); // Works fine too
$.ajax({
type: 'POST',
url: '/Person/Save',
data: data,
dataType: 'json',
success: function (data) {
alert(data);
}
});
};
Andere Tipps
Sie haben Ihr Ansichtsmodell als Funktion definiert (eine Klasse, wenn Sie möchten):
function MyViewModel() {
this.text = ko.observable('');
}
Stattdessen sollten Sie es als var (ein Objekt) definieren:
var MyViewModel = {
text: ko.observable('');
}
Sie sollten dann feststellen, dass Folgendes gut funktioniert:
var data = ko.ToJSON(MyViewModel);