Передать значение модалу начальной загрузки из таблицы начальной загрузки - PullRequest
0 голосов
/ 11 октября 2018

Я настраиваю приложение для фляги (только что запустил фляжку на этой неделе, я также неопытен в html / javascript, поэтому не стреляйте в меня) и хочу иметь возможность удалять данные из базы данных, но хочу иметь возможностьчтобы модал показывался с просьбой о подтверждении (потому что я думаю, что это выглядит красиво и аккуратно).

В течение последних двух дней я пытался заставить это модальное подтверждение работать и не смог добитьсятот.Я уже рассматривал подобный вопрос, опубликованный здесь, и не смог заставить его работать.Так что моя попытка - это сочетание того, что я нашел в этих постах.

Моя таблица, созданная с помощью jinja (я думаю), выглядит так, как показано ниже, и когда пользователь нажимает кнопку удаления, я хочу показать модальные подтверждения и иметь возможность перейти к модальным по крайней мере "Issueer.Id "значение.

Сможете ли вы пролить свет на то, что я делаю неправильно, или на какой-нибудь совет, как подойти к этому, или на любую другую идею, чтобы решить эту проблему?enter image description here

Мой код здесь:

{% extends 'layout.html' %}
{%  block body %}

    <h2>Issuer Mappings</h2>
    <a class="btn btn-success" href="add-issuer-mapping">Add mapping</a>
    <hr>
    <input type="text" class="form-control" id="allocationCodeInput" onkeyup="myFunction()" placeholder="Search for allocation codes.." title="Type in a allocation code">
    <hr>
    <table class="table table-striped table-sm ", id="IssuerMappingTable">
        <tr>
            <th>Allocation Code</th>
            <th>Issuer</th>
            <th>Backing</th>
            <th>Country</th>
            <th>Region</th>
            <th>Sector</th>
            <th width="150">Asset Class (Adj)</th>
            <th>PM (Adj)</th>
            <th>PM Initials</th>
            <th>Strategy (Adj)</th>
            <th>OffPiste</th>
            <th>Liquidity</th>
            <th></th>
            <th></th>
        </tr>
        {% for issuer in issuer_mappings %}
            <tr>
                <td><a href="issuer-mappings/{{issuer.Id}}">{{issuer.AllocationCode}}</a></td>
                <td>{{ issuer.Issuer }}</td>
                <td>{{ issuer.Backing }}</td>
                <td>{{ issuer.Country }}</td>
                <td>{{ issuer.Region }}</td>
                <td>{{ issuer.Sector }}</td>
                <td>{{ issuer.AssetClass_ADJ }}</td>
                <td>{{ issuer.PM_ADJ }}</td>
                <td>{{ issuer.PM_Initials }}</td>
                <td>{{ issuer.Strategy_ADJ }}</td>
                <td>{{ issuer.OffPiste }}</td>
                <td>{{ issuer.Liquidity }}</td>
                <td><a href="issuer-mappings/edit-issuer-mapping/{{ issuer.Id }}" class="btn btn-warning btn-sm pull-right">Edit</a></td>
                <td>
                    <a class="btn btn-danger btn-sm pull-right" data-toggle="modal" data-target="#IssuerMappingDeleteModal" data-id="{{ issuer.Id }}">Delete</a>
                </td>

            </tr>
        {% endfor %}
    </table>
    <div id="IssuerMappingDeleteModal" class="modal fade" role="dialog">
        <div class="modal-dialog">
            <div class="modal-content">
                <div class="modal-header">
                    <h3 class="modal-title">Delete Issuer Mapping?</h3>
                    <button type="button" class="close" data-dismiss="modal">&times;</button>
                </div>
                <div class="modal-body" id="issMapId">
                    <!-- display some how the id here-->
                    <p>The selected issuer mapping is about to be deleted.<br>Do you want to proceed?</p>
                </div>
                <div class="modal-footer">
                    <form method="POST"> <!-- to add the delete action later -->
                        <input type="hidden" name="_method" value="DELETE">
                        <input type="submit" value="Yes" class="btn btn-danger" >
                    </form>
                    <button type="button" class="btn btn-default" data-dismiss="modal">No</button>
                </div>
            </div>
        </div>
    </div>
    <script type="text/javascript">
        $(document).on("click", ".btn-danger", function () {
             var issuerMappingId = $(this).data('id');
             $(this).find('#issMapId').html($('<b> Issuer Mapping id: ' + issuerMappingId  + '</b>'))
        });
    </script>
{% endblock %}

Ответы [ 3 ]

0 голосов
/ 11 октября 2018
$(this).find('#issMapId').html($('<b> Issuer Mapping id: ' + issuerMappingId  + '</b>'))

Ваш контекст this по-прежнему является кнопкой ... поэтому он не может найти #issMapId

Попробуйте $(document).find('#issMapId').html($('<b> Issuer Mapping id: ' + issuerMappingId + '</b>'))

0 голосов
/ 12 октября 2018

хорошо, так что я попробовал еще несколько вещей (также прошел учебник по javascript, хотел бы я сделать это раньше).Ответ @ therecluse26 (высоко ценится за подробный ответ) предложил использовать ajax (в отличие от формы) для отправки моего запроса на удаление.Однако, поскольку я очень новичок в этом, и я не уверен в себе, пользователь оставил свое решение в форме.

, поэтому я обновил свою функцию js, как показано ниже:

<script type="text/javascript">
        function deleteButtonClicked(issMapId, issMapName) {
            document.getElementById("issMapId").innerHTML = "Allocation Code " + issMapName + " (id:" + issMapId + ") will be deleted. <br>Do you want to proceed?";
            var element = document.getElementById("deleteForm");
            element.setAttribute("action",  "issuer-mappings/delete-issuer-mapping/" + issMapId)
        }
    </script>

, и я обновил мой модальный код, как показано ниже, и в настоящее время он работает.

<div class="modal-body">
                    <!-- display some how the id here-->
                    <p id="issMapId"></p>
                </div>
                <div class="modal-footer">
                    <form id="deleteForm" method="POST"> <!-- to add the delete action later -->
                        <input type="hidden" name="_method" value="DELETE">
                        <input type="submit" value="Yes" class="btn btn-danger" >
                    </form>
                    <button type="button" class="btn btn-default" data-dismiss="modal">No</button>
                </div>

, и этоэто кнопка, которая показывает модальный

<td>
                    <a class="btn btn-danger btn-sm pull-right"
                       onclick="deleteButtonClicked({{ issuer.Id}},'{{ issuer.AllocationCode }}')"
                       data-toggle="modal" data-target="#IssuerMappingDeleteModal">Delete</a>
                </td>
0 голосов
/ 11 октября 2018

Прежде всего, вы захотите отправить свои данные, используя запрос Ajax, а не отправку формы на странице, что приведет к обновлению / перенаправлению страницы.Ajax позволит вам отправить запрос на сервер без необходимости каждый раз обновлять страницу. jQuery.ajax () документация

Существует несколько способов решения этой проблемы.Я бы сказал, что, вероятно, самым простым и лучшим способом было бы полностью отказаться от модальной модели, определив функцию-обертку, которая отправляет запрос DELETE на удаленный сервер и заменяет модальную функциональность функцией confirm() (она возвращает true, когда подтверждено).

Например:

function deleteIssuer(id){

  if (confirm("The selected issuer mapping is about to be deleted. Do you want to proceed?")){

    /*** Ajax request to server to delete goes here ***/

  } else {

    return;

  }
}

Если вы абсолютно уверены, что хотите использовать модальный режим Bootstrap для этого, вы можете определить две отдельные функции для выполнения.что-то вроде:

function deleteIssuer(id){

  // This populates a hidden input field (you will need to create somewhere in the page) with the issuer ID
  $("#hiddenIdField").val(id);

  // Shows your modal
  $("#IssuerMappingDeleteModal").modal("show");

}

function sendDeleteRequest(){

  var id = $("#hiddenIdField").val(); // Pass this id to Ajax function

  /*** Ajax request to server to delete goes here ***/

}

Наконец, вам также нужно заменить кнопку <input type="submit" value="Yes" class="btn btn-danger" > на вашем модале на что-то вроде <button type="button" onClick="sendDeleteRequest()" class="btn btn-danger" data-dismiss="modal">Yes</button>


В обоих случаях вы 'Вы будете вызывать функцию deleteIssuer(id) из созданной кнопки «Удалить», поэтому замените тег <a> на: <button class="btn btn-danger btn-sm pull-right" onClick="deleteIssuer({{ issuer.Id }})">Delete</button>

Это должно приблизить вас к тому, что вам нужно, вы простонеобходимо определить запрос $.ajax() и обработчик удаления на стороне сервера, и все должно быть готово.Было бы также неплохо добавить защиту от csrf, если вы можете, чтобы избежать определенных типов эксплойтов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...