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, так как это должно быть достаточно легко, и я думаю, что я просто усложняю вещи.
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.
если указан удаленный 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">×</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(); });
Comments