Я хочу добавить кнопку удаления в каждую строку, где статус ЗАКАЗАН. Пробовал разные варианты. Это решение могло работать без ошибки «Невозможно прочитать свойство 'id' of undefined», даже если data [i] не undefined. Предупреждение перед .click () дает правильный идентификатор. Что здесь не так? Могу я здесь сделать что-то по-другому или лучше?
).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.info("Call failed: "+errorThrown);
});
}



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете установить уникальные атрибуты данных для кнопок удаления, используя идентификаторы из данных ответа следующим образом: -
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 не будет определен.
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.info(i);
});
}
array.forEach(click => click());
})();Решение - создать новый const в цикле:
(function right() {
var array = [];
for (i = 0; i < 2; i++) {
const constI = i;
array.push(() => {
console.info(constI);
});
}
array.forEach(click => click());
})();$(".delete") относится к кнопкам удаления все, которые существуют в момент регистрации .click().
Вы должны зарегистрироваться только на последней кнопке удаления:
const constI = i;
$(".delete").last().click(() => {
deleteUser(data[constI].id);
})
В стрелочных функциях нет явного
this