jquery - 重新计算指数
问题描述
我有这样的功能来添加/删除输入。索引必须是连续的和增量的才能正常工作。但是,当某些输入被删除时,索引会继续存储输入的值,出现顺序的中断,导致从数据库返回的数据不正确。如何在每次删除时重新计算索引?我只尝试了这种方法,但没有奏效:
var j = 0, i = 0;
$(".key").each(function(i) {
$(this).attr('name', 'properties['+i+'][key]');
i++;
});
$(".value").each(function(j) {
$(this).attr('name', 'properties['+j+'][key]');
j++;
});
var i = 0;
$("#addRow").click(function () {
var html = '';
html += '<div id="inputFormRow">';
html += '<div class="input-group mb-3">';
html += i+'<input type="text" name="properties['+i+'][key]" class="key form-control m-input ml-3" placeholder="Key" autocomplete="off">';
html += i+'<input type="text" name="properties['+i+'][value]" class="value form-control m-input ml-3" placeholder="Value" autocomplete="off">';
html += '<div class="input-group-append ml-3">';
html += '<button id="removeRow" type="button" class="btn btn-danger">Delete</button>';
html += '</div>';
html += '</div>';
i++;
$('#newRow').append(html);
});
// remove row
$(document).on('click', '#removeRow', function () {
$(this).closest('#inputFormRow').remove();
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="newRow"></div>
<button id="addRow" type="button" class="btn btn-info">Add field</button>
如果可以改进此代码,它可能会起作用。存储了正确的索引,但由于某种原因,每个项目字段都设置为相同的数字并且不递增。
$(document).on('click', '#removeRow', function () {
i--;
$(this).closest('#inputFormRow').remove();
for (i = 0; i < $('.key').length; i++){
$('.key').attr('name', 'properties['+i+'][key]');
$('.value').attr('name', 'properties['+i+'][value]');
};
});
var i = 0;
$("#addRow").click(function () {
var html = '';
html += '<div id="inputFormRow">';
html += '<div class="input-group mb-3">';
html += '<input type="text" name="properties['+i+'][key]" class="key form-control m-input ml-3" placeholder="Key" autocomplete="off">';
html += '<input type="text" name="properties['+i+'][value]" class="value form-control m-input ml-3" placeholder="Value" autocomplete="off">';
html += '<div class="input-group-append ml-3">';
html += '<button id="removeRow" type="button" class="btn btn-danger">Delete</button>';
html += '</div>';
html += '</div>';
i++;
$('#newRow').append(html);
});
// remove row
$(document).on('click', '#removeRow', function () {
i--;
$(this).closest('#inputFormRow').remove();
for (i = 0; i < $('.key').length; i++){
$('.key').attr('name', 'properties['+i+'][key]');
$('.value').attr('name', 'properties['+i+'][value]');
};
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="newRow"></div>
<button id="addRow" type="button" class="btn btn-info">Add field</button>
解决方案
可能最简单的方法就是重新索引它们。您可以等到提交之前,但对于每个操作来说,这并不是一项艰巨的任务。
请注意,您正在重复 ID,因此它们已更改为类,因为根据定义,ID 是唯一的
以下循环遍历每一行并获取该行的索引以传递给字段索引值
function reIndex(){
const reg=/\[\d+\]/;
// `each` callback of row provides index needed
$('.inputFormRow').each(function(i){
$(this).find('.key,.value').attr('name', function(_, curr){
return curr.replace(reg, '[' + i +']')
});
});
// for demo only set values with names to see effects
// remove this in production
$('.key,.value').val(function(){
return this.name
})
}
$("#addRow").click(function () {
let i = 100
var html = '';
html += '<div class="inputFormRow">';
html += '<div class="input-group mb-3">';
html += '<input type="text" name="properties['+i+'][key]" class="key form-control m-input ml-3" placeholder="Key" autocomplete="off">';
html += '<input type="text" name="properties['+i+'][value]" class="value form-control m-input ml-3" placeholder="Value" autocomplete="off">';
html += '<div class="input-group-append ml-3">';
html += '<button type="button" class="removeRow btn btn-danger">Delete</button>';
html += '</div>';
html += '</div>';
$('#newRow').append(html);
reIndex()
});
// remove row
$(document).on('click', '.removeRow', function () {
$(this).closest('.inputFormRow').remove();
reIndex()
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="newRow"></div>
<button id="addRow" type="button" class="btn btn-info">Add field</button>
推荐阅读
- php - 将 SQL 搜索查询转换为 Eloquent 查询
- javascript - React 路由会干扰 Express 端点
- python - PyTorch 数据加载器中的“工人数量”参数实际上是如何工作的?
- javascript - 如何使用 nodejs 按其内部数组大小对数组进行排序?
- xquery - Zorba 不仅仅是一个文件系统
- java - 使用带有非 ASCII 密码的 PCKS#12 证书
- javascript - 将部分html标签复制到另一个
- c++ - 范围内临时对象的生命周期是多少?
- docker - Docker:从中间层删除文件
- java - 将 bean 注册到 Spring 上下文是一种反范式吗?