Używam bootstrap z Twittera, określiłem modal
<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>
I linki
<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>
Kiedy klikam którykolwiek z tych łączy po raz pierwszy, widzę poprawną treść, ale kiedy klikam inne linki, wyświetla tę samą treść załadowaną po raz pierwszy, nie aktualizuje treści.
Chcę, aby był aktualizowany za każdym razem, gdy zostanie kliknięty.
PS: Mogę z łatwością sprawić, by działało za pomocą niestandardowej funkcji jQuery, ale chcę wiedzieć, czy jest to możliwe dzięki natywnej modalnej funkcji zdalnego Bootstrap, ponieważ powinno to być dość łatwe i myślę, że tylko komplikuję.
jquery
jquery-plugins
twitter-bootstrap
modal-dialog
Dhruv Kumar Jha
źródło
źródło
remote
moduły są przestarzałe od wersji Bootstrap v3.2.1 i znikną w wersji v4.Odpowiedzi:
Problem jest dwojaki.
Po pierwsze , po utworzeniu instancji obiektu Modal jest on trwale dołączany do elementu określonego przez
data-target
i kolejne wywołania, aby pokazać, że modal wywoła tylkotoggle()
ten obiekt, ale nie zaktualizuje wartości woptions
. Tak więc, chociażhref
atrybuty są różne w różnych linkach, podczas przełączania modalu wartość parametruremote
nie jest aktualizowana. W przypadku większości opcji można obejść ten problem, bezpośrednio edytując obiekt. Na przykład:To jednak nie zadziała w tym przypadku, ponieważ ...
Po drugie , wtyczka Modal została zaprojektowana w taki sposób, aby ładować zdalny zasób do konstruktora obiektu Modal, co niestety oznacza, że nawet jeśli zostanie dokonana zmiana w
options.remote
, nigdy nie zostanie przeładowana .Prostym rozwiązaniem jest zniszczenie obiektu Modal przed kolejnymi przełączeniami. Jedną z opcji jest po prostu zniszczenie go po zakończeniu ukrywania:
Uwaga: Dostosuj selektory według potrzeb. To jest najbardziej ogólne.
Plunker
Lub możesz spróbować wymyślić bardziej skomplikowany schemat, aby zrobić coś takiego jak sprawdzenie, czy link uruchamiający modal różni się od poprzedniego. Jeśli tak, zniszcz; jeśli nie jest, to nie trzeba go ponownie ładować.
źródło
hide
klasy o modalu, więc jeśli twoje okno było zbyt małe, modal mógł blokować zdarzenia myszy na przyciskach. Z jakiegoś powodu JSFiddle.net jest dziś naprawdę zły (504 próbuje zaktualizować), więc po prostu zredagowałem przykład na plnkr.co, co i tak jest lepsze dla AJAX.bs.modal
w$(this).removeData('bs.modal')
pracował dla mnie z Bootstrap 3$('body').on('hidden.bs.modal', '.modal', function () { $(this).removeData('bs.modal'); });
var modalData = $(this).data('bs.modal'); if (modalData && modalData.options.remote)...
Do bootstrap 3 powinieneś użyć:
źródło
remoteData
wierszem lub po nim :$(this).empty()
$(this).empty()
.remote
Opcja ładuje dane zdalnych do zagnieżdżonego<div class="modal-content">
elementu. Użyj$('.modal-content', this).empty();
zamiast tego.W przypadku Bootstrap 3.1 będziesz chciał usunąć dane i opróżnić
modal-content
zamiast całego okna dialogowego (3.0), aby uniknąć migotania podczas oczekiwania na załadowanie zdalnej zawartości.Jeśli używasz modów nie-zdalnych, powyższy kod oczywiście usunie ich zawartość po zamknięciu (źle). Może być konieczne dodanie czegoś do tych modów (np.
.local-modal
Klasy), aby nie miało to wpływu. Następnie zmodyfikuj powyższy kod, aby:źródło
$(e.target).removeData("bs.modal").find(".modal-content").empty();
, mój modal jakoś się ukrywa i pojawia się tylko szara nakładka.Dzięki merv. Zacząłem majstrować przy boostrap.js, ale twoja odpowiedź to szybkie i czyste obejście. Oto, co ostatecznie wykorzystałem w moim kodzie.
źródło
Przyjęta odpowiedź nie działała dla mnie, więc wybrałem JavaScript.
źródło
Działa to z FYI Bootstrap 3
źródło
Mój projekt jest wbudowany w Yii i używa wtyczki Bootstrap-Yii, więc ta odpowiedź jest ważna tylko wtedy, gdy używasz Yii.
Powyższa poprawka zadziałała, ale dopiero po pierwszym wyświetleniu modalu. Za pierwszym razem okazało się puste. Myślę, że dzieje się tak, ponieważ po mojej inicjacji kodu Yii wywołuje funkcję ukrywania modalu, usuwając w ten sposób moje zmienne inicjujące.
Odkryłem, że załatwienie wywołania removeData bezpośrednio przed kodem uruchamiającym modal załatwiło sprawę. Więc mój kod ma następującą strukturę ...
źródło
W Bootstrap 3.2.0 zdarzenie „on” musi znajdować się w dokumencie i należy opróżnić moduł:
W Bootstrap 3.1.0 zdarzenie „on” może znajdować się na ciele:
źródło
Dlaczego nie uczynić tego bardziej ogólnym z BS 3? Wystarczy użyć „[coś] modalnego” jako identyfikatora modalnego DIV.
źródło
Jedyną działającą opcją dla mnie jest:
Używam Bootstrap 3 i mam wywoływaną funkcję,
popup('popup content')
która dołącza moduł modalny HTML.źródło
Dodanie $ (this) .html (''); aby wyczyścić widoczne dane, i działa całkiem dobrze
źródło
Jeśli podany jest zdalny adres URL, zawartość zostanie załadowana jeden raz za pośrednictwem jQuery metody ładowania i wstrzyknięta do div .modal-content. Jeśli korzystasz z interfejsu API danych, możesz alternatywnie użyć atrybutu href, aby określić źródło zdalne. Przykład tego pokazano poniżej
źródło
Dodałem coś takiego, ponieważ starsza treść jest wyświetlana, dopóki nie pojawi się nowa, z rozszerzeniem .html ('') wewnątrz zawartości .modal wyczyści HTML wewnątrz, mam nadzieję, że pomoże
źródło
Napisałem prosty fragment obsługujący odświeżanie modalu. Zasadniczo przechowuje kliknięty link w danych modalu i sprawdza, czy jest to ten sam link, który został kliknięty, usuwając lub nie modalne dane.
źródło
W przypadku Bootstrap 3 w modal.js zmieniłem:
do
(dodatkowe odstępy dodane dla przejrzystości)
Zapobiega to niechcianemu flashowaniu starej zawartości modalnej poprzez wywołanie empty () w kontenerze modalnym, a także usunięcie danych.
źródło
Ten działa dla mnie.
źródło
To inne podejście działa dla mnie dobrze:
źródło
Który element HTML chcesz opróżnić (div, span cokolwiek).
źródło
Ten działa dla mnie:
modalny
scenariusz
links-area to obszar, w którym umieszczam dane i muszę je wyczyścić
źródło
Rozszerzona wersja zaakceptowanej odpowiedzi przez @merv. Sprawdza również, czy ukryty modal jest ładowany ze zdalnego źródła i czyści starą zawartość, aby zapobiec flashowaniu.
https://gist.github.com/WojtekKruszewski/ae86d7fb59879715ae1e6dd623f743c5
źródło
Testowane na wersji Bootstrap 3.3.2
źródło
.removeData()
bez parametrów spowoduje, że jquery usunie wszystkie dane dołączone do tego elementu. Jeśli chodzi o problem PO, to wystarczyłby.removeData('bs.modal')
lub.removeData('modal')
byłby bardzo bezpieczny.Powodzenia z tym:
źródło