Передача данных строки динамической таблицы в модальное диалоговое окно с помощью кнопки «Удалить» - PullRequest
0 голосов
/ 01 марта 2019

Контекст
У меня есть маршрут GET, который загружает файл .ejs, который добавляет строки данных в таблицу на основе длины переданной переменной accounts.Здесь accounts - массив словарей с ключами _id, type, nickname, rewards, balance, customer_id.

    <% if (accounts.length > 0) { %>
      <% accounts.forEach(account => { %>
        <tr class="blue-grey lighten-3 account-row">
          <th scope="row" class="account-id"><%= account._id %></th>
          <td><%= account.type %></td>
          <td><%= account.nickname %></td>
          <td><%= account.rewards %></td>
          <td>$<%= account.balance %></td>
          <td><%= account.customer_id %></td>
          <td>
            <span class="table-remove">
              <button type="button" class="btn btn-danger btn-rounded btn-sm my-0 remove" data-toggle="modal" data-target="#removeAccountModal">
                Remove
              </button>
            </span>
          </td>
          <div class="modal fade" id="removeAccountModal" tabindex="-1" role="dialog" aria-labelledby="removeAccountModalLabel"
            aria-hidden="true">
            <div class="modal-dialog" role="document">
              <div class="modal-content">
                <div class="modal-header">
                  <h5 class="modal-title" id="removeAccountModalLabel">You are about to remove this account</h5>
                  <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                    <span aria-hidden="true">&times;</span>
                  </button>
                </div>
                <div class="modal-body">
                  CAUTION!!!
                  <br>
                  <br>
                  Removing this account will delete all the data associated with it. You must visit a local branch to retrieve any monies left residing in the account.
                </div>
                <div class="modal-footer">
                  <button type="button" class="btn grey darken-1" data-dismiss="modal">Cancel</button>
                  <form id="remove-form" action="/" method="POST">
                    <button id="removeAccount" class="btn btn-primary" type="submit">Remove Account</button>
                  </form>
                </div>
              </div>
            </div>
          </div>
        </tr>
      <% }) %>

Issue
В каждой строке данных есть кнопка удаления, открывающая модальный Bootstrap, подтверждающая, что пользователь действительно хочет удалить данные этой строки.После отправки в модальном режиме это инициирует запрос DELETE в форме элемента form.

Я хочу передать связанную переменную account._id выбранной строки, чтобы я мог изменить form атрибут action для /<%= account._id %>/?_METHOD=DELETE.

У меня проблемы с доступом к элементам DOM родительского окна модального окна.

Мой код jQuery выглядит следующим образом:

<script>
 $(document).ready(function () {
  console.log("loaded and ready to go!"); // works as expected
  var $remove = $(".remove"); // works as expected
  console.log($remove.length); // works as expected
  $(".remove").click(() => {
   console.log("I'm in the modal!") // works as expected
   var $parent = $(this).parent().closest("tr"); // find row
   console.log($parent); // w.fn.init [prevObject: w.fn.init(0)]
   var $account_id = $parent.find("th"); // find account id
   console.log($account_id); // w.fn.init [prevObject: w.fn.init(0)]
   console.log($account_id.text()); // returns blank type string
   $("#remove-form").prop("action", "/" + $account_id + "?
    _method=DELETE"); // change action attribute to account id value
   })
 });
</script>

Использованные методы:

console.log(window.parent.$(this).closest("tr"));       
// returns w.fn.init [prevObject: w.fn.init(1)]

Ответы [ 2 ]

0 голосов
/ 02 марта 2019

Спасибо @dimitris tseggenes за то, что вы указали мне правильное направление.
Уникальные id s для каждого модального div здесь были обязательны.Оказывается, значение атрибута id не должно состоять только из цифр.

Я произвел рефакторинг атрибутов id и target-data, чтобы они выглядели соответственно следующим образом:

id="account<%= account._id %>id"
data-target=#account"<%= account._id %>id"

Я выучилИсходя из ответов в этом посте:

  1. Не забудьте сделать модальные дивы уникальными, если у вас будет несколько модалов, то есть в таблице, и соответственно изменить элемент действия, используя атрибут data-target
  2. атрибуты id не должны содержать только цифры
0 голосов
/ 01 марта 2019

вы поместили модал внутри цикла forEach.Таким образом, вы не имеете только один модальный, вместо этого у вас есть один для каждой строки.Проблема здесь в том, что вы присвоили один и тот же идентификатор removeAccountModal для всех них.Попробуйте назначить уникальный идентификатор каждому модалу, например:

<div class="modal fade" id="<%= account._id %>" tabindex="-1" role="dialog" aria-labelledby="removeAccountModalLabel" aria-hidden="true">

и на каждой кнопке удаления замените цель данных на

data-target="#<%= account._id %>"

Таким образом, у вас есть уникальные модалы, и теперь вы можетепоместите <%= account._id %> непосредственно в атрибут действия

...