我想向状态为ORDERED的每一行添加删除按钮。我尝试了不同的变化。即使data [i]没有未定义,该解决方案也可以正常工作,不会出现错误“无法读取未定义的属性'id'”。 .click()给出正确的ID之前发出警报。怎么了我可以在这里做些其他的事情还是做得更好?
).done( (data, status, jqXHR) => {
if(data[0].order_username != undefined) {
$("#orders_table").empty();
for(var i = 0; i < data.length; i++) {
var button = "";
if(data[i].status == "ORDERED") {
button = "<td><button class='delete'>Delete</button></td>";
}
$("#orders_table").append(
"<tr>" +
"<td>" + data[i].order_username + "</td>"+
"<td>" + data[i].work_description + "</td>" +
"<td>" + dateFormatter(data[i].orderdate) + "</td>" +
"<td>" + dateFormatter(data[i].startdate) + "</td>" +
"<td>" + dateFormatter(data[i].readydate) + "</td>" +
"<td>" + dateFormatter(data[i].accepteddate) + "</td>" +
"<td>" + dateFormatter(data[i].denieddate) + "</td>" +
"<td>" + data[i].comment_of_work + "</td>" +
"<td>" + data[i].hours + "</td>" +
"<td>" + data[i].approx_budget + "</td>" +
"<td>" + data[i].status + "</td>" +
button +
"</tr>"
)
alert(data[i].id);
$(".delete").click(() => {
deleteUser(data[i].id);
})
}
}
function deleteUser(key) {
$.ajax(
{
url: "http:localhost:3001/workorders_delete/"+key,
method: 'delete'
}).done( (data, status, jqXHR) => {
}).fail( (jqXHR, status, errorThrown) => {
console.log("Call failed: "+errorThrown);
});
}
答案 0 :(得分:-1)
您可以使用响应数据中的ID为删除按钮设置唯一的数据属性,如下所示:-
if(data[i].status == "ORDERED") {
button = "<td><button class='delete' data-deleteId =
"+data[i].id+">Delete</button></td>";
}
,然后您可以为删除按钮编写一个单击事件侦听器,如下所示:-
$(".delete").click(function(){
var id = $(this).data("deleteId");
deleteUser(id);
});
在您的代码中:-
$(".delete").click(() => {
deleteUser(data[i].id);
});
在单击时调用或执行deleteUser()函数,此时将不会定义data [i] .id。
答案 1 :(得分:-2)
data[i]
undefined
?在循环中,i
是对循环后具有值data.length
的同一变量的引用。
如预期的那样,data[data.length]
是undefined
。在alert(i)
中使用.click()
进行检查。
$(".delete").last().click(() => {
alert(i);
deleteUser(data[i].id);
})
一个简化的示例:
(function wrong() {
var array = [];
for (i = 0; i < 2; i++) {
array.push(() => {
console.log(i);
});
}
array.forEach(click => click());
})();
解决方案是在循环中创建一个新的const
:
(function right() {
var array = [];
for (i = 0; i < 2; i++) {
const constI = i;
array.push(() => {
console.log(constI);
});
}
array.forEach(click => click());
})();
$(".delete")
是指在您注册.click()
时存在的全部删除按钮。
您应该只在最后一个删除按钮上注册:
const constI = i;
$(".delete").last().click(() => {
deleteUser(data[constI].id);
})