Twitter bootstrap remote modal показывает один и тот же контент каждый раз



Я использую Twitter bootstrap, я указал модальный



<div class="modal hide" id="modal-item">

<div class="modal-header">
<button type="button" class="close" data-dismiss="modal">x</button>
<h3>Update Item</h3>
</div>

<form action="http://www.website.com/update" method="POST" class="form-horizontal">

<div class="modal-body">
Loading content...
</div>

<div class="modal-footer">
<a href="#" class="btn" data-dismiss="modal">Close</a>
<button class="btn btn-primary" type="submit">Update Item</button>
</div>

</form>

</div>


и ссылки



<a href="http://www.website.com/item/1" data-target="#modal-item" data-toggle="modal">Edit 1</a>
<a href="http://www.website.com/item/2" data-target="#modal-item" data-toggle="modal">Edit 2</a>
<a href="http://www.website.com/item/3" data-target="#modal-item" data-toggle="modal">Edit 2</a>


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



Я хочу, чтобы он обновлялся каждый раз, когда его нажимали.



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

606   22  

22 ответов:

проблема в два раза.

первый, как только модальный объект создается, он постоянно присоединяется к элементу, указанному data-target и последующие вызовы, чтобы показать, что модальный будет вызывать только toggle() на нем, но не будет обновлять значения в options. Так что, даже несмотря на href атрибуты различны на разных ссылках, когда модальный переключается, значение для remote не обновляются. Для большинства вариантов, можно обойти это путем непосредственно редактирование объекта. Например:

$('#myModal').data('bs.modal').options.remote = "http://website.com/item/7";

однако, это не будет работать в этом случае, потому что...

второй, модальный плагин предназначен для загрузки удаленного ресурса в конструкторе модального объекта, что, к сожалению, означает, что даже если изменение внесено в options.remote,он никогда не будет перезагружен.

простое средство состоит в том, чтобы уничтожить модальный объект перед последующими переключениями. Один вариант-просто уничтожить его после того, как он закончит скрываться:

$('body').on('hidden.bs.modal', '.modal', function () {
  $(this).removeData('bs.modal');
});

Примечание: настройки селекторов по мере необходимости. Это самое общее.

Plunker

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

для Bootstrap 3, Вы должны использовать:

$('body').on('hidden.bs.modal', '.modal', function () {
    $(this).removeData('bs.modal');
});

для Bootstrap 3.1 вы хотите удалить данные и очистить modal-content, а не весь диалог (3.0), чтобы избежать мерцания во время ожидания удаленного контента для загрузки.

$(document).on("hidden.bs.modal", function (e) {
    $(e.target).removeData("bs.modal").find(".modal-content").empty();
});

если вы используете не удаленные модалы, то приведенный выше код, конечно же, удалит их содержимое после закрытия (плохо). Возможно, вам придется добавить что-то к этим модалам (например,.local-modal класс), поэтому они не затронуты. Затем измените приведенный выше код на:

$(document).on("hidden.bs.modal", ".modal:not(.local-modal)", function (e) {
    $(e.target).removeData("bs.modal").find(".modal-content").empty();
});

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

$('#modal-item').on('hidden', function() {
    $(this).removeData('modal');
});

принятый ответ не работа для меня, поэтому я пошел с JavaScript, чтобы сделать это.

<a href="/foo" class="modal-link">
<a href="/bar" class="modal-link">

<script>
$(function() {
    $(".modal-link").click(function(event) {
        event.preventDefault()
        $('#myModal').removeData("modal")
        $('#myModal').modal({remote: $(this).attr("href")})
    })
})

это работает с Bootstrap 3 FYI

$('#myModal').on('hidden.bs.modal', function () {
  $(this).removeData('bs.modal');
});

мой проект построен в Yii и использует плагин Bootstrap-Yii, поэтому этот ответ актуален только в том случае, если вы используете Yii.

вышеуказанное исправление действительно работало, но только после первого показа модального. В первый раз он оказался пустым. Я думаю, что это потому, что после моей инициализации кода Yii вызывает функцию hide модального, тем самым очищая мои переменные инициации.

Я обнаружил, что помещая вызов removeData непосредственно перед кодом, который запустил модал сделал свое дело. Так что мой код структурирован следующим образом...

$ ("#myModal").removeData ('modal');
$ ('#myModal').modal ({remote : 'path_to_remote'});

в Bootstrap 3.2.0 событие " on " должно быть в документе, и вы должны очистить модальное :

$(document).on("hidden.bs.modal", function (e) {
    $(e.target).removeData("bs.modal").find(".modal-content").empty();
});

в Bootstrap 3.1.0 событие " on " может быть на теле :

$('body').on('hidden.bs.modal', '.modal', function () {
    $(this).removeData('bs.modal');
});

почему бы не сделать его более общим с BS 3? Просто используйте "[что-то]модальное" в качестве идентификатора модального DIV.

$("div[id$='modal']").on('hidden.bs.modal',
    function () {
        $(this).removeData('bs.modal');
    }
);

единственный рабочий вариант для меня:

$('body').on('hidden.bs.modal', '#modalBox', function () {
    $(this).remove();
});

Я использую Bootstrap 3 и у меня есть функция, которая называется popup('popup content') который добавляет модальное поле html.

добавление $(this).html ("); чтобы очистить видимые данные, а также, и это работает довольно хорошо

если указан удаленный URL-адрес, содержимое будет загружено один раз через jQuery загрузить метод и впрыснутый в.модально-содержание разд. Если вы используете data-api, вы можете также использовать атрибут href для указания удаленного источника. Пример этого показан ниже

$.ajaxSetup ({
    // Disable caching of AJAX responses
    cache: false
});

Я добавил что-то вроде этого, потому что старый контент отображается до тех пор, пока не появится новый .html (") внутри .modal-content очистит HTML внутри, надеюсь, это поможет

$('#myModal').on('hidden.bs.modal', function () {
   $('#myModal').removeData('bs.modal');
   $('#myModal').find('.modal-content').html('');
});

Я написал простой фрагмент, обрабатывающий обновление модального. В основном он хранит нажатую ссылку в модальных данных и проверить, если это та же ссылка, которая была нажата, удаление или нет модальных данных.

var handleModal = function()
{
    $('.triggeringLink').click(function(event) {
        var $logsModal = $('#logsModal');
        var $triggeringLink = $logsModal.data('triggeringLink');

        event.preventDefault();

        if ($logsModal.data('modal') != undefined
            && $triggeringLink != undefined
            && !$triggeringLink.is($(this))
        ) {
            $logsModal.removeData('modal');
        }

        $logsModal.data('triggeringLink', $(this));

        $logsModal.modal({ remote: $(this).attr('href') });
        $logsModal.modal('show');
    });
};

для Bootstrap 3, в модальном режиме.js я изменил:

$(document)
  .on('show.bs.modal',  '.modal', function () { $(document.body).addClass('modal-open') })
  .on('hidden.bs.modal', '.modal', function () { $(document.body).removeClass('modal-open'); })

до

$(document)
  .on('show.bs.modal',  '.modal', function () { $(document.body).addClass('modal-open') })
  .on('hidden.bs.modal', '.modal', function () { 
    $(this).removeData('bs.modal').empty()
    $(document.body).removeClass('modal-open')
  })

(добавлено дополнительное расстояние для ясности)

это предотвращает любую нежелательную вспышку старого модального содержимого, вызывая empty () в модальном контейнере, а также удаляя данные.

        $('#myModal').on('hidden.bs.modal', function () {
            $(this).removeData('modal');
        });

это работает для меня.

этот другой подход хорошо работает для меня:

$("#myModal").on("show.bs.modal", function(e) {
    var link = $(e.relatedTarget);
    $(this).find(".modal-body").load(link.attr("href"));
});
$('body').on('hidden.bs.modal', '.modal', function () {
       $("#mention Id here what you showed inside modal body").empty()
});

какой элемент html вы хотите очистить, как (div, span whatever).

это работает для меня:

модальные

<div class="modal fade" id="searchKaryawan" tabindex="-1" role="dialog" aria-labelledby="SearchKaryawanLabel" aria-hidden="true"> <div class="modal-dialog">
<div class="modal-content">
  <div class="modal-header">
    <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
    <h4 class="modal-title" id="SearchKaryawanLabel">Cari Karyawan</h4>
  </div>
  <div class="modal-body">
    <input type="hidden" name="location">
    <input name="cariNama" type="text" class="form-control" onkeyup="if (this.value.length > 3) cariNikNama();" />
    <div class="links-area" id="links-area"></div>
  </div>
  <div class="modal-footer">
  </div>
</div> </div></div>

скрипт

<script type="text/javascript">$('body').on('hidden.bs.modal', '.modal', function () {  $(".links-area").empty() }); </script>

ссылки-это область, где я помещаю данные и нужно очистить

Расширенная версия принятого ответа @merv. Он также проверяет, загружается ли модальное скрытие из удаленного источника и очищает старое содержимое, чтобы предотвратить его мигание.

$(document).on('hidden.bs.modal', '.modal', function () {
  var modalData = $(this).data('bs.modal');

  // Destroy modal if has remote source – don't want to destroy modals with static content.
  if (modalData && modalData.options.remote) {
    // Destroy component. Next time new component is created and loads fresh content
    $(this).removeData('bs.modal');
    // Also clear loaded content, otherwise it would flash before new one is loaded.
    $(this).find(".modal-content").empty();
  }
});

https://gist.github.com/WojtekKruszewski/ae86d7fb59879715ae1e6dd623f743c5

протестировано на Bootstrap версии 3.3.2

  $('#myModal').on('hide.bs.modal', function() {
    $(this).removeData();
  });

удачи с этим:

$('#myModal').on('hidden.bs.modal', function () {
    location.reload();
});

Comments

    Ничего не найдено.