Я хочу иметь таблицу продуктов, в каждой из которых есть кнопка редактирования и удаления.Каждая кнопка редактирования запускает всплывающее окно, которое имеет форму для обновления продукта.Каждая кнопка удаления является только подтверждением.
В моей коллекции mongodb есть строка таблицы для каждого продукта.Я генерирую это с помощью цикла for.
Моя проблема в том, что каждый поповер такой же, как в первой строке.Все данные внутри всплывающих окон также поступают из первого продукта.Таким образом, нажатие edit на 3-й строке и нажатие update фактически обновят первую строку.
Я использую Bootstrap 4 (Popsvers для таблиц и Bootstrap), JQuery и EJS.
EJS
<table class="table table-light table-hover">
<thead class=" thead-light">
<tr>
<th scope="col">#</th>
<th scope="col">ObjectID</th>
<th scope="col">Name</th>
<th scope="col">Price</th>
<th scope="col">Options</th>
</tr>
</thead>
<tbody>
<% for(var i=0; i < products.length; i++) {%>
<tr>
<td>
<%= i+1 %>
</td>
<td>
<%= products[i]._id.toString() %>
</td>
<td>
<%= products[i].name %>
</td>
<td>
<%= products[i].price %>
</td>
<td>
<button id="product-update" class="product-update btn btn-warning" data-placement="bottom" data-toggle="popover" data-title="Update Product" data-container="body" type="button" data-html="true" href="#" id="login">
<span data-feather="edit"></span>
</button>
<div id="popover-product-update" class="popover-product-update d-none">
<form action="/dashboardproducts/update" method="POST">
<div class="form-group">
<label for="name">Product Name:</label>
<input type="text" class="form-control" name="name">
</div>
<div class="form-group">
<label for="price">Product Price:</label>
<input type="text" class="form-control" name="price">
</div>
<div class="form-group d-none">
<label for="id">Product ID:</label>
<input type="text" class="form-control" name="id" value="<%= products[i]._id.toString() %>">
</div>
<button type="submit" class="btn btn-success">Update</button>
</form>
</div>
<button id="product-delete" class="product-delete btn btn-danger" data-placement="bottom" data-toggle="popover" data-title="Are you sure you want to delete this product?" data-container="body" type="button" data-html="true" href="#" id="login">
<span data-feather="trash-2"></span>
</button>
<div id="popover-product-delete" class="popover-product-delete d-none">
<form action="/dashboardproducts/delete" method="POST">
<div class="form-group d-none">
<label for="id">Product ID:</label>
<input type="text" class="form-control" name="id" value="<%= products[i]._id.toString() %>">
</div>
<button type="submit" class="btn btn-danger">Yes</button>
</form>
</div>
</td>
</tr>
<% } %>
</tbody>
</table>
jQuery
$('.product-update').popover({
html: true,
content: function() {
return $('.popover-product-update').html();
}
});
$('.product-delete').popover({
html: true,
content: function() {
return $('.popover-product-delete').html();
}
});
Как видите, у каждого обновления / удаления всплывающего окна есть скрытое поле идентификатора, которое автоматически заполняется в цикле for.
Я пытался отобразить идентификатор объекта в каждом поповере, и все они показывают идентификатор объекта первого продукта в таблице.В дополнение к форме обновления и кнопке удаления, влияющим только на первый продукт в таблице, это заставляет меня поверить, что все всплывающие окна, генерируемые в цикле for, одинаковы, а идентификатором автозаполнения всегда является идентификатор первого продукта.
Кто-нибудь может мне помочь с этим разобраться?
У меня есть демо здесь: https://thawing -garden-41890.herokuapp.com / dashboardproducts