【问题标题】:Knockout json data showing too many rows淘汰赛 json 数据显示太多行
【发布时间】: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) =&gt; (i % 5 ? Object.assign(res[res.length - 1], kvp) : res.push(kvp), res), [])

标签: json knockout.js


【解决方案1】:

Knockout foreach 绑定到数组中的每个元素。通过像您一样定义 json 结构,您将在表中有 15 行。您也无法知道id 对应于name

我已将您的 JSON 结构更改如下:

[{ "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"}] 

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 更改为的内容。
  • 如果你觉得我的回答对你有帮助,你可以accept my answer
【解决方案2】:

再深入一点:如果我想根据这些数据构建一个表单,我该怎么做?

假设我想将每一行显示为表单的一部分。然后 JSON 数据也将用于控制输入元素。例如:我想在我的 JSON 中定义“id”是一个隐藏字段,而“name”是只读的。这将根据 JSON 以不同方式应用于每组数据。

<table class="table">
<tr><td><input type="hidden" name="id" value="1" /></td></tr>
<tr><td><input type="text" name="name" readonly="readonly" value="George" /></td></tr>
</table>
<table class="table">
<tr><td><input type="hidden" name="id" value="2" /></td></tr>
<tr><td><input type="text" name="name" disabled="disabled" value="Jerry" /></td></tr>
</table>
<table class="table">
<tr><td><input type="hidden" name="id" value="3" /></td></tr>
<tr><td><input type="text" name="name" size="75" value="Elaine" /></td></tr>
</table>

【讨论】:

    猜你喜欢
    • 2014-12-16
    • 2012-06-06
    • 2019-01-09
    • 2015-12-02
    • 2019-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多