KnockoutJS:ko.ToJSON(这个)不起作用?

时间:2011-12-02 09:23:40

标签: knockout.js knockout-mapping-plugin

以下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)不起作用 并抛出一个错误:“错误:对象不支持此属性或 方法“

可能有些微不足道的遗漏或错误,但我看不到它。有什么提示吗?

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

您已将视图模型定义为函数(如果您愿意,可以使用类):

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

相反,您应该将其定义为var(对象):

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

然后您应该发现以下情况正常:

var data = ko.ToJSON(MyViewModel);