jQuery перетаскиваемые метаданные очистки - PullRequest
0 голосов
/ 17 ноября 2011

Я реализую перетаскиваемый плагин jQuery, а также плагин метаданных, но пытаюсь получить доступ к метаданным из функции обратного вызова Droppable. Я могу получить доступ к метаданным вне перетаскиваемых / сбрасываемых функций, и это прекрасно работает; но когда я вызываю изнутри функцию, я получаю пустой объект - если я предварительно не загружаю метаданные. Позвольте мне объяснить подробнее ... У меня есть следующее:

<div id="NavigationSorting">
<ul class="drgLocation">
    <li>
    <span>Location 1</span>
        <ul class="drgArea">
            <li data="{JobAreaID: '1'}">
            <div class="dzArea ui-droppable"></div>
            <span>Area 1</span>
                <ul class="drgTreatment">
                    <li><span>Treatment 1.1</span></li>
                    <li><span>Treatment 1.2</span></li>
                </ul>
            </li>
            <li data="{JobAreaID: '2'}" id="test">
            <div class="dzArea ui-droppable"></div>
            <span>Area 2</span>
                <ul class="drgTreatment">
                    <li><span>Treatment 2.1</span></li>
                    <li><span>Treatment 2.2</span></li>
                </ul>
            </li>
        </ul>
    </li>
</ul>

В блоке document.ready есть следующее:

        $('#NavigationSorting .dzArea').droppable({
        accept: '.drgArea li',
        tolerance: 'touch',
        hoverClass: 'droppableArea',
        drop: function (e, ui) {
            var ul = $(this).parent();

            var data2 = $(ui.draggable).metadata({ type: 'attr', name: 'data' });
            alert(data2.JobAreaID);

            ul.before(ui.draggable);
        }
    });

    $('#NavigationSorting .drgArea>li').draggable({
        //handle: ' > dl',
        opacity: .8,
        addClasses: false,
        helper: 'clone',
        zIndex: 100
    });

Если я перетаскиваю 2-й LI вверх, я получаю пустой объект для данных (JobAreaID не определен). Однако, если я добавлю следующий перед перетаскиваемым / сбрасываемым кодом, он будет работать:

var data = $("#test").metadata({ type: 'attr', name: 'data' });

Это нормально в моем тестовом сценарии, но в производственном процессе я не буду знать все значения идентификаторов (не говоря уже о том, что это кажется пустой тратой). Я подумал о добавлении класса и его использовании в селекторе метаданных, но он получает только данные из первого соответствующего элемента, поэтому в этом случае JobAreaID 2 будет иметь значение null.

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

Спасибо!

1 Ответ

0 голосов
/ 18 ноября 2011

Я до сих пор не думаю, что это лучший подход, но я решил эту проблему, перебрав все мои элементы, содержащие данные, и заполнив метаданные по отдельности, например:

$("#NavigationSorting .drgArea>li").each(function (i) {
    $(this).metadata({ type: 'attr', name: 'data' });
});

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

...