Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Обновление Dialog'а (https://javascript.ru/forum/jquery/21668-obnovlenie-dialog%27.html)

Lewik 19.09.2011 21:31

Обновление Dialog'а
 
У меня словесный понос, но постараюсь сдерживаться.
Дано:
На сайте показываются различные Dialog'и, сделанные из div'ов.
Идентифицируются по id div'а.
В принципе, между ними общее только этот div-оболочка. Содержимое div'а - все что угодно. Например, JS, который после обновления* должен корректно работать.

А, и в этот же div входит генерируемый на php код JS JQuery UI, который инициализирует и настраивает этот же dialog.

Писать оригинал не буду - код циклопический.
Но должно быть похоже на такое:
<div   id="'.$sSide_guid.'">
<script>
$(document).ready(function()
{
$("#'.$sSide_guid.'").dialog({blablabla})
</script>
</div>


Задача:
Обновление окна - это клиент посылает ajax на сервер и тот возвращает сгенерированный код, которым надо просто заменить старое окно. Причем после обновления, JS, делающий из div'а dialog может поменяться. (Да и в самом "теле" окна может быть еще куча всякого JS)

Обновление должно вызываться из внутренностей div'а dialog'а.
Например, по отправке формы или по специальной кно.. короче, элемент с click'ом или чем там еще - обязательно расположен внутри div'а dialog'а.


Решение:
И что я только не делал...
Как я понимаю - обновление должно делаться на стороне - надо вызывать функцию обновления с определенными параметрами, она будет отправлять ajax, получать готовый код, удалять старое окно и вставлять новое. Но после второй итерации старое не удаляется. Как мне кажется - проблема в id.
function reload_side(side_id,new_side)
				{
					var tmp;
					tmp = document.getElementById(side_id);
					tmp.empty();
					$('#insert_new_side_marker').prepend(new_side);
				};

Ну тут new_side генерачится в самом dialog'е, а потом передается функции. Ну не суть важно где новое окно генерачится.

Я сначала еще пробовал делать обновление с помощью кода в dialog'е, но... или окно само себя удаляет и болт, или окно сначала ставит замену, а потом путается в id (их то теперь два одинаковых)

Я даж аську дам - 232633173.

DjDiablo 20.09.2011 10:46

Нафига удалять старое окно, заменить его содержимое недостаточно ?

this.element.html('новое содержимое диалога');

только надо думать где вызывать this невезде указывает на диалог.
должно проканать внутри далогов унаследованных от ui.dialog, или контролёров повешанных на тот же элемент что и диалог (например написанных на jquery ui, или javascriptМVС), проконает ли this внутри callback'ов не знаю, вроде как должен.


Если всё таки надо удалить старое окно тогда.
$(".testDialog").dialog("destroy");


ну а новые создавать ты уже научился ))

DjDiablo 20.09.2011 11:18

А вообще если внутри диалогов много js кода.
1)тогда заведи контроллёры для окон. например унаследуй виджет от диалог, и пропиши там свой нужный код, только init непереопределяй.

2)или создай новый виджет и используй его как контроллер.

тогда инициализация будет выглядеть так.
$(".myWin").dialog();
$(".myWin").myController();// здесь внутри весь javascript код для окна


если развивать 2ю идею то инициализацию диалога можно запихнкть прям в init контроллера. Тогда нужно будет инициализировать только контроллер
init:function(){
    this.element.dialog();
},


вызов будет выглядеть.
$(".testWin").myController();// создаст и контроллер и диалог

Lewik 20.09.2011 15:10

function reload_side(side_id,new_side)
{
	$('#'+side_id).dialog('destroy');
	$('#insert_new_side_marker').prepend(new_side);
};

Та же бнопня: Первое обновление - ок. После второго остается старое.

this.element.html('новое содержимое диалога'); - вообще никак

Простите за не технические фразы:
Как я понимаю, если я делаю обновление окна изнутри окна - будет болт: функция замены не сможет "завершиться", как я понимаю. То же будет если я вызову что-то изнутри окна - этому что-то будет некуда возвращаться.

Надо это делать полностью извне. Если выше я прав - то... мыслей нет никаких.

Вот про контроллеры я не знаю ничего - сейчас погуглю.

Lewik 23.09.2011 15:21

Что-то нивкакую...
Как вешать эти контроллеры - так и не понял...
Через bind чтоли?

Приведите (или дайте сылку) простейший пример контроллера. Желательно html увидеть тоже.
Я прочитал, что такое MVC, ничего особо нового. Я прекрасно понимал и до этого зачем оно и т.п.
Но я никак не разберусь с синтаксисом.

makeObservableSubject - это стандартный медот или от jQuery?
Ага, это не стандарт, не могу найти где скачать.

=======================

Кажется ларчик просто открывался: $('#div_id').html(new_side);
Просто .html
Проверяю на всякий.

DjDiablo 23.09.2011 23:48

Ну раз так хочется MVC, то выслал в личку пример использования контролёров.
Потом подумал и выложил здесь на всякий пожарный ))

Набросал пошустрому вот эту демо.
http://depositfiles.com/files/oc8qksvtx
Максимум коментариев на примитивном языке, минимум функционала.

jqueryUI почти аналогичен. В инете по jqueryUI, море уроков.

Lewik 25.09.2011 14:39

Замечательно.
После "обновления" dialog'а - тест выпадает из textarea =)
Он буквально пишется ВНЕ textarea. А сам textarea получается пустым и форма отсылает пустоту =)
Как написал - сразу увидел <textarea/>текст</textarea> =) Как удалить пост не нашел.


Часовой пояс GMT +3, время: 22:41.