【发布时间】:2018-03-28 05:56:52
【问题描述】:
我有一个淘汰视图模型,它由一个 observableArray 对象组成。
我正在使用这个 json 数据来填充数组
这个 JSON 结构是我真实结构的简化版本。在那,我想为一个项目赋予几个属性,例如控制是否启用表单输入:{"name":"George", "input_disabled":"true", "input_maxlength":"50} 等
function listItem(id, name, address) {
var self = this;
self.id = ko.observable(id);
self.name = ko.observable(name);
self.address = ko.observable(address);
}
function vModel(data) {
var self = this;
self.listArray = ko.observableArray();
$.each(data, function(key, val) {
self.listArray.push(new listItem(val.id, val.name, val.address));
});
return {
listArray : self.listArray
}
}
var jsondata = [
{"id":"1"}, {"name":"George"}, {"age": "35"}, {"occupation": "Architect"}, {"address":"NY"},
{"id":"2"}, {"name":"Jerry"}, {"age": "35"}, {"occupation": "Comedian"}, {"address":"Brooklyn"},
{"id":"3"}, {"name":"Elaine"}, {"age": "35"}, {"occupation": "Publisher"}, {"address":"Manhattan"}
];
ko.applyBindings(new vModel(jsondata));
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<table class="table table-striped">
<tbody data-bind="foreach: listArray()">
<tr>
<td>ID</td>
<td data-bind="text: id"></td>
</tr>
<tr>
<td>Name</td>
<td data-bind="text: name"></td>
</tr>
<tr>
<td>Address</td>
<td data-bind="text: address"></td>
</tr>
</tbody>
</table>
当我使用包含的 JSON 填充数组时,foreach 循环会打印出太多行。根据淘汰文档,foreach 循环为数组中的每个项目复制 html 元素。
但问题是,我有没有办法让这个 JSON 与淘汰赛一起工作?还是我必须将 JSON 更改为类似于:var jsondata = [[{"id":"1"}, {"name":"George"}]] 等
【问题讨论】:
-
您需要为每一行设置一个单一对象数组,例如
var jsondata = [{ "id": "1", "name": "George", "age": "35", "occupation": "Architect", "address": "NY" }, { "id": "2", "name": "Jerry", "age": "35", "occupation": "Comedian", "address": "Brooklyn" } ] -
谢谢你,我会更改传入的JSON。
-
如果你可以,你肯定应该改变服务器端的数据格式。如果不能,您可以将数组分成 5 个键值对的部分,然后使用
Object.assign合并它们。例如,在一个丑陋的单行中:jsondata.reduce((res, kvp, i) => (i % 5 ? Object.assign(res[res.length - 1], kvp) : res.push(kvp), res), [])
标签: json knockout.js