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?

War es hilfreich?

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);

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top