在淘汰赛中将JSON对象列表作为JSON对象传递

时间:2016-01-21 20:34:49

标签: json knockout.js

我在客户端有一系列的淘汰限制复选框,我需要通过AJAX传递给需要JSON格式请求的服务器。前端的复选框如下所示:

 <div data-bind="foreach: Items">
     <input type="checkbox" data-bind="checkedValue: $data, checked: $root.returnedItems, attr: { value: itemNumber}" />
 </div>

通过使checkedValue为$ data,它将Item对象存储在数组中。

处理AJAX调用的js 大致这个(因为公司内部帮助函数不同而改变了一些):

self.returnedItems = ko.observableArray()
self.showArray = function () {
     $.ajax({
        type: 'POST',
        url: url,
        data: ko.toJSON(self.returnedItems()),
        dataType: 'json',
    });
}

ko.toJSON(self.returnedItems())用于将对象列表转换为要传递的JSON字符串。但是,它给我的结果是:

  

[{ “项”: “12088”, “降序”: “无线电”, “数量”:1},{ “项”: “1T1S”, “降序”:TV “数量”:1}]

这本身不是正确的JSON格式(在hindsighht中有意义),因为它没有与数组外括号相关联的键,它需要看起来像这样:

  

{itemList:[{“item”:“12088”,“desc”:“Radio”,“qty”:1},{“item”:“1T1S”,“desc”:TV“,qty”: 1}]}

但我不能为我的生活找到一个好的方法来完成这个而不改变AJAX调用发送这个:

data: "{itemList:" + ko.toJSON(self.returnedItems()) + "}"

哪个有效,但看起来很hacky。是否有更简单的方法在Knockout中传递格式良好的JSON对象列表?

1 个答案:

答案 0 :(得分:4)

数组是有效的JSON,它不是JSON 对象。如果你的ajax需要一个JSON对象,你应该能够像这样包装它:ko.toJSON({itemList: self.returnedItems()})