KnockoutJS-发送包含javascript对象值的表单会导致超时


KnockoutJS - Sending a form containing the value of a javascript object results in a timeout

我在尝试发送表单时遇到了一个问题,如果存在特定的字段类型,页面将返回超时。

我正在使用KnockoutJS的映射插件来映射来自服务器的对象。我可以修改对象,并希望将其发回。

为此,我创建了一个计算函数,该函数返回我将此特定对象传递给的ko.toJSON的结果。然后,这个值被放在一个隐藏的输入中,发送回服务器:

<input type="hidden" name="a" data-bind="value: exportToJSON()" />

当我发送带有此输入字段的表格时,我收到一个错误7:

错误7(net::ERR_TIMED_OUT):操作超时。

这是一个代表我的代码的JSFiddle

http://jsfiddle.net/etiennenoel/4EXSy/17/

我怀疑问题是因为通过POST发送的字段中的数据没有转义而引起的?

更新1

有人建议使用ko.mapping.toJSON。但是,这样做会导致一个空字符串,请在此处查看:http://jsfiddle.net/etiennenoel/4EXSy/18/

更新2

现在,由于@abc123,结果输入不是空的:http://jsfiddle.net/etiennenoel/4EXSy/19/.然而,在发送POST数据时,我仍然会超时。您可以在代码中看到当我发送表单时发送的POST数据:http://pastebin.com/hNRm4zdZ

更新3

我正在使用symfony2,我开始认为这个问题可能与symfony2中的某些内容有关,因为当我将表单复制并粘贴到一个简单的.html文件上时,数据会被发送。。。

更新4

我删除了Symfony2 dev.log,点击按钮发送表单,得到了超时错误,不幸的是,日志仍然是空的。。。。此外,所有php和apache日志都没有显示任何内容。。。

更新5

我最终决定在另一台服务器上测试我的symfony网站,它在另一个服务器上运行。。。现在这变得很奇怪,为什么它不能在我的本地服务器上工作?我使用MAMP Pro作为本地服务器

返回ko.mapping.toJSON(self.playersEvaluation)时,如果不调用函数,就无法访问knocket的属性,因为它实际上是一个函数。

要让它返回正确的JSON,请执行以下操作:

function appViewModel() {
    var self = this;
    self.playersEvaluation = ko.observableArray();
    self.exportToJSON = ko.computed(function() {
          return ko.mapping.toJSON(self.playersEvaluation())
    }, this);
}

JSFiddle:http://jsfiddle.net/abc123/WReza/1/

要轻松使用控制台:http://jsfiddle.net/abc123/WReza/1/embedded/result/

幸运的是,由于您正在使用ko.mapping插件,这将起作用,因为它可以执行以下操作:

  • 对象的所有属性都转换为可观察的属性。如果更新会更改值,则会更新可观测值
  • 数组被转换为可观察的数组。如果更新会更改项目数,则会执行相应的添加/删除操作。它还将尝试保持与原始JavaScript数组相同的顺序

取自ko.mapping