KnockoutJS: ko.ToJSON (это) не работает?

Следующий 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-скрипта в объект JSON: ko.ToJSON(this) не работает и выдает ошибку: «Ошибка: объект не поддерживает это свойство или метод»

Вероятно, что-то тривиальное отсутствует или неправильно, но я не вижу этого. Какие-нибудь советы ?


person Stef Heyenrath    schedule 02.12.2011    source источник
comment
Это хороший шаблон для использования - и он будет работать, если вы используете toJSON, а не ToJSON (Knockout полностью поддерживает этот шаблон, вы только что допустили опечатку в своем коде).   -  person Sean Vieira    schedule 03.12.2011


Ответы (2)


В Knockout нет метода 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);
        }
    });
};
person Sean Vieira    schedule 02.12.2011
comment
Шон спасибо за помощь. (Иногда это очень просто). По какой-то причине javascript Intellisense работал некорректно, поэтому я не видел этой ошибки. - person Stef Heyenrath; 03.12.2011
comment
Добавьте следующие ссылки в начало вашего файла javascript ///‹reference path=~/укажите путь к файлу Knockout.js здесь› - person akeeseth; 07.12.2012

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

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

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

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

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

var data = ko.ToJSON(MyViewModel);
person Mark Robinson    schedule 02.12.2011
comment
Я понимаю, но не понимаю, почему я могу получить доступ к свойству объекта, но не к самому объекту? - person Stef Heyenrath; 02.12.2011
comment
Я думаю, что это связано с разницей между первым объявлением функции и вторым выражением функции. Это может помочь: stackoverflow.com/questions/5754538/ - person Mark Robinson; 02.12.2011
comment
@MarkRobinson - на самом деле Knockout поддерживает использование this так, как его использует Стеф - у Knockout просто нет метода ToJSON (метод, который он ищет, - toJSON. - person Sean Vieira; 03.12.2011
comment
Не имеет значения, объявлять ли как встроенный объект или как метод. Это имеет значение только в том случае, если вам нужно использовать это, скажем, для ko.dependable, поскольку встроенные объекты не поддерживают это как ключевое слово. - person Simon Halsey; 04.12.2011