如何使用 Json 对象填充动态添加的输入字段
How to populate dynamically added input fields with Json object
我有一个 table 的输入字段,我可以在 KnockoutJS 的帮助下动态添加行
<table id="sTypeTable" class="table table-bordered" hidden="hidden">
<tr>
<th> Name </th>
<th> Value </th>
<th> <a class="btn btn-primary btn-sm" onclick="addReqField(0);"><i class="fa fa-plus"></i></a></th>
</tr>
<!-- ko foreach: {data: requestFields, as: 'reqField'} -->
<tr id="sRow">
<td>
<input id="sName" data-bind="value: reqField[0]" onblur="createJSON()"/>
</td>
<td>
<input id="sValue" data-bind="value: reqField[0]" onblur="createJSON()"/>
</td>
<td>
<a class="btn btn-warning btn-sm" data-bind="click: removeResField2" ><i class="glyphicon glyphicon-remove"></i></a>
</td>
</tr>
<!-- /ko -->
</table>
<div class="col-md-11 ">
<textarea style="font-size: larger; min-height: 200px" class="form-control" id="requestData" oninput="storeValueOfTextArea()"></textarea>
</div>
我正在根据这些输入生成
在 textarea (id="requestData") 上关注 Json 对象
[
{
"users": [
{
"name": "John",
"value": "12"
},
{
"name": "Sarah",
"value": "13"
},
{
"name": "Tom",
"value": "14"
}
]
}
]
它运行良好,但现在我需要从 Json 对象填充这些输入字段,
当对象进入文本区域时。
我试过以下方式
<script th:inline="javascript">
function storeValueOfTextArea() {
var lines = $('#requestData').val();
var texts = JSON.parse(lines);
for (var i=0; i!== texts[0].users.length;i++){
addReqField(); // method for adding new row of input fields
let v = texts[0].users[i];
$("tr[id=sRow]").each(function() {
$("#sName").val(v.name);
$("#sValue").val(v.value);
});
}
</script>
但结果只有第一个输入字段获得最后一个对象
{
"name": "Tom",
"value": "14"
}
其他留空
$("tr[id=sRow]").each(function() {
$("#sName").val(v.name);
$("#sValue").val(v.value);
});
这好像不太好。您应该根据要为其填充数据的用户的索引来获取所需的行索引。现在,它所做的是在 for 循环的所有迭代中用相同的用户数据填充每一行。最终,最后一个用户数据将在所有行中。
我认为问题在于您为每个创建的新行赋予相同的 ID sRow。
所以在你的循环中
$("tr[id=sRow]").each(function() {
$("#sName").val(v.name);
$("#sValue").val(v.value);
});
在最后一次迭代中,这将使用 Tom 和 14 对象的最后值填充所有 sRow 元素。
尝试给你的行一个唯一的 id,比如 sRow + 一个从 0 开始的计数器 sRow0 sRow1...
谢谢所有回答这个问题的人。
我已经通过这种方式解决了这个问题
for (let i=0; i!== texts[0].values.length;i++){
addReqField();
let v = texts[0].values[i];
$("tr[id=sRow]").each(function(index) {
if (index === i){
$(this).find("#sName").val(v.name);
$(this).find("#sValue").val(v.value);
}
});
}
我有一个 table 的输入字段,我可以在 KnockoutJS 的帮助下动态添加行
<table id="sTypeTable" class="table table-bordered" hidden="hidden">
<tr>
<th> Name </th>
<th> Value </th>
<th> <a class="btn btn-primary btn-sm" onclick="addReqField(0);"><i class="fa fa-plus"></i></a></th>
</tr>
<!-- ko foreach: {data: requestFields, as: 'reqField'} -->
<tr id="sRow">
<td>
<input id="sName" data-bind="value: reqField[0]" onblur="createJSON()"/>
</td>
<td>
<input id="sValue" data-bind="value: reqField[0]" onblur="createJSON()"/>
</td>
<td>
<a class="btn btn-warning btn-sm" data-bind="click: removeResField2" ><i class="glyphicon glyphicon-remove"></i></a>
</td>
</tr>
<!-- /ko -->
</table>
<div class="col-md-11 ">
<textarea style="font-size: larger; min-height: 200px" class="form-control" id="requestData" oninput="storeValueOfTextArea()"></textarea>
</div>
我正在根据这些输入生成 在 textarea (id="requestData") 上关注 Json 对象
[
{
"users": [
{
"name": "John",
"value": "12"
},
{
"name": "Sarah",
"value": "13"
},
{
"name": "Tom",
"value": "14"
}
]
}
]
它运行良好,但现在我需要从 Json 对象填充这些输入字段, 当对象进入文本区域时。 我试过以下方式
<script th:inline="javascript">
function storeValueOfTextArea() {
var lines = $('#requestData').val();
var texts = JSON.parse(lines);
for (var i=0; i!== texts[0].users.length;i++){
addReqField(); // method for adding new row of input fields
let v = texts[0].users[i];
$("tr[id=sRow]").each(function() {
$("#sName").val(v.name);
$("#sValue").val(v.value);
});
}
</script>
但结果只有第一个输入字段获得最后一个对象
{
"name": "Tom",
"value": "14"
}
其他留空
$("tr[id=sRow]").each(function() {
$("#sName").val(v.name);
$("#sValue").val(v.value);
});
这好像不太好。您应该根据要为其填充数据的用户的索引来获取所需的行索引。现在,它所做的是在 for 循环的所有迭代中用相同的用户数据填充每一行。最终,最后一个用户数据将在所有行中。
我认为问题在于您为每个创建的新行赋予相同的 ID sRow。
所以在你的循环中
$("tr[id=sRow]").each(function() {
$("#sName").val(v.name);
$("#sValue").val(v.value);
});
在最后一次迭代中,这将使用 Tom 和 14 对象的最后值填充所有 sRow 元素。 尝试给你的行一个唯一的 id,比如 sRow + 一个从 0 开始的计数器 sRow0 sRow1...
谢谢所有回答这个问题的人。 我已经通过这种方式解决了这个问题
for (let i=0; i!== texts[0].values.length;i++){
addReqField();
let v = texts[0].values[i];
$("tr[id=sRow]").each(function(index) {
if (index === i){
$(this).find("#sName").val(v.name);
$(this).find("#sValue").val(v.value);
}
});
}