KnockoutJS: ko.ToJSON (это) не работает? - PullRequest
2 голосов
/ 02 декабря 2011

Следующий java-скрипт, который определяет объект MyViewModel со свойством " text " и функцией " save ".

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


И определена следующая кнопка:

<button data-bind="click: save">SAVE</button>


Результат при нажатии кнопки:

  • Доступ к свойству с помощью this.text() работает нормально
  • Преобразование объекта java-script в объект JSON: ko.ToJSON (this) не работает и выдает ошибку: «Ошибка: объект не поддерживает это свойство или метод»

Возможно, что-то тривиально отсутствует или неправильно, но я не вижу этого.Любые советы?

Ответы [ 2 ]

4 голосов
/ 03 декабря 2011

У нокаута нет метода ToJSON - у него есть метод toJSON:

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);
        }
    });
};
0 голосов
/ 02 декабря 2011

Вы определили модель представления как функцию (если хотите, класс):

function MyViewModel() {
    this.text = ko.observable('');
}

Вместо этого вы должны определить ее как переменную (объект):

var MyViewModel = {
    text: ko.observable('');
}

Затем вы обнаружите, что следующее прекрасно работает:

var data = ko.ToJSON(MyViewModel);
...