【问题标题】:KnockoutJS : ko.ToJSON(this) does not work?KnockoutJS:ko.ToJSON(this) 不起作用?
【发布时间】:2012-01-11 08:32:21
【问题描述】:

以下 java 脚本定义了具有属性“text”和函数“save”的 MyViewModel 对象。

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

可能是一些微不足道的东西丢失或错误,但我看不到。有什么建议吗?

【问题讨论】:

  • 这是一个很好的使用模式——如果你使用toJSON而不是ToJSON,它会起作用(Knockout完全支持这种模式,你只是在你的代码中有错字)。跨度>

标签: knockout.js knockout-mapping-plugin


【解决方案1】:

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

【讨论】:

  • 肖恩感谢您的帮助。 (有时很简单)。由于某种原因,javascript Intellisense 无法正常工作,所以我没有看到此错误。
  • 在你的 javascript 文件的开头添加以下引用 ///
【解决方案2】:

你已经将你的视图模型定义为一个函数(一个类,如果你喜欢的话):

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

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

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

然后您应该会发现以下工作正常:

var data = ko.ToJSON(MyViewModel);

【讨论】:

  • 我明白了,但我不明白为什么我可以访问对象的属性,但不能访问对象本身?
  • 我认为这与第一个是函数声明和第二个是函数表达式之间的区别有关。这可能会有所帮助:stackoverflow.com/questions/5754538/…
  • @MarkRobinson - 实际上,Knockout 支持以 Stef 使用它的方式使用 this - Knockout 根本没有 ToJSON 方法(他正在寻找的方法是 toJSON。跨度>
  • 声明为内联对象或方法没有区别。仅当您需要使用 this 时才重要,例如 ko.dependable,因为内联对象不支持 this 作为关键字。
猜你喜欢
  • 1970-01-01
  • 2018-05-26
  • 2014-07-28
  • 1970-01-01
  • 2012-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多