Передать значение в загруженный ajax-ом диалог?

Добрый день.



Пишу модуль для jQuery и столкнулся с проблемой. Модуль занимается обслуживанием параллельного списка объектов доступа (пользователи и группы):

— русское название или имя

— идентификатор

— тип объекта.



На форме есть поле с автоподстановкой по мере ввода (для добавления без диалога) и поле для поиска с диалогом.



7a9404eb91241d5785ec0936a2853e77.png



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



f73c51ea9f90a914b9e77c9bbf6a219f.png



Код, который все это делает



(function ($) {<br>
    $.fn.namesSelector = function(){<br>
        var fieldName = $(this).attr("id");<br>
<br>
        // добавляем к выбиратору с лупой открывание диалога<br>
        var selector = $("#" + fieldName + "_selector");<br>
        $(selector).css("cursor", "pointer");<br>
        $(selector).bind("click", function() {<br>
            var items = new Array();<br>
            var arr_ids = new Array();<br>
            var arr_names = new Array();<br>
            var arr_types = new Array();<br>
            // получаем выбранных на момент нажатия людей<br>
            $.each($('input[name="' + fieldName + '[name][]"]'), function(key, value){<br>
                arr_names[arr_names.length] = $(value).val();<br>
            });<br>
            $.each($('input[name="' + fieldName + '[id][]"]'), function(key, value){<br>
                arr_ids[arr_ids.length] = $(value).val();<br>
            });<br>
            $.each($('input[name="' + fieldName + '[type][]"]'), function(key, value){<br>
                arr_types[arr_types.length] = $(value).val();<br>
            });<br>
            $.each(arr_names, function(key, value) {<br>
                var obj = new Object();<br>
                obj.id = arr_ids[key];<br>
                obj.name = arr_names[key];<br>
                obj.type = arr_types[key];<br>
                items[items.length] = obj;<br>
            });<br>
<br>
            var dialog = $("<div>").load(web_root + "_modules/_acl_manager/?action=personSelectDialog", function(){<br>
                $(this).dialog({<br>
                    width: 700,<br>
                    height: 300,<br>
                    title: "Выбор людей"<br>
                });<br>
                var selector = $(this).find("#dialog_names")[0];<br>
                // добавляем в диалог уже выбранных людей<br>
                $(selector).empty();<br>
            });<br>
        });<br>
    }<br>
})(jQuery);<br>




Самый большой вопрос — никак не заполнить поле со списком в показанном диалоговом окне, так как в контексте диалога недоступна переменная items.



Можно это как-нибудь вообще сделать или у меня в корне неправильный подход?
  • Вопрос задан
  • 3741 просмотр
Пригласить эксперта
Ответы на вопрос 2
AMar4enko
@AMar4enko
Тут куча вариантов, на самом деле, но я бы после того, как items сформирован, затолкал его в data элемента, к которому применялся модуль. Вначале его сохранить как var $el = $(this), а после формирования items сделать $el.data('selection', items); А в диалоге var selection = $el.data('selection'); Вообще было бы достаточно в контексте модуля определить var selections= {}; после чего сохранять туда items как selections.[fieldname] = items; Но вдруг вам где-нибудь еще эти items понадобятся.
Ответ написан
darkneo
@darkneo Автор вопроса
Спасибо!

Сходил, выпил кофе, еще походил. Раз не могу написать жаваскриптом — напишу на php. =)
Переписал вызов диалога на вот такой:

            $.ajax({
                url: web_root + "_modules/_acl_manager/?action=personSelectDialog",
                data: {
                    items: items
                },
                type: "post"
            }).done(function(html){
                $("<div>").html(html).dialog({
                    width: 700,
                    height: 300,
                    title: "Выбор людей",
                    buttons: {
                        "Отмена": function() {
                            alert("Отмена");
                        },
                        "Сохранить": function() {
                            alert("Сохранить");
                        }
                    }
                });
            });


А на сервере уже заполняю поля нужными значениями.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы