在序列化期间获取敲除中的复选框绑定错误

时间:2015-04-30 13:17:35

标签: javascript jquery html5 serialization knockout.js

我收到错误:

  

未捕获的InvalidStateError:无法读取' selectionDirection'属性来自' HTMLInputElement':输入元素的类型('复选框')不支持选择。

在:

<div class="panel-heading paddingRight20px">
  <input style="position: absolute;" type="checkbox" data-bind="checked: IsSelectedCoverage" />
</div>

当我调试代码时,我发现当我尝试序列化viewmodel(具有IsSelectedCoverage可观察的)时会出现此错误。

我正在序列化的Ajax调用:

self.finish = function () {
    debugger;
    var CorrespondenceData = ko.toJSON(self);
    $.ajax({
        url: endPoints.Finish + '/' + self.MemberId(),
        type: 'POST',
        dataType: 'json',
        data: CorrespondenceData,
        contentType: 'application/json; charset=utf-8',
        beforeSend: function () {
            startSpinner();
        }
    })

我不确定这是否是由于序列化模型造成的。

1 个答案:

答案 0 :(得分:1)

就像@Jeroen所说的那样,我们至少需要看一下你的视图模型来确定原因,但这里有一些可能有用的东西:你依赖于Knockout提供的开箱即用的序列化,但是你可以覆盖它以更加确定返回的内容。

如果你向你的视图模型添加一个名为toJSON的函数,那么这将由Knockout调用(尽管你可以轻松地自己调用它)。这样就可以对序列化的内容和方式进行更精细的控制。 [source]

在这个toJSON函数中,如果你不想单调地写出整个JSON字符串,那么你可以构建一个非常简单的对象并在其上调用toJSON

例如,假设您的视图模型有15个可观察对象,但服务器只对其中的2个firstNamelastName感兴趣:

var toJSON = function() {
    return JSON.stringify({
                                firstName: this.firstName(),
                                lastName: this.lastName()
                          });

this.firstName()获取同一视图模型上firstName可观察值的值。

在该视图模型上调用toJSONko.toJSON现在将返回仅包含这两个属性的JSON字符串

可能是您的视图模型上有一些无关的属性,它会将意外的内容发送回服务器。