Может ли объект dojo.dnd.Source содержать другой объект dojo.dnd.Source в качестве одного из дочерних узлов? - PullRequest
1 голос
/ 03 марта 2011

Я посмотрел на эту ссылку для учебника по функции перетаскивания в Dojo. Но я заметил одну вещь: во всех примерах элементы, которые нужно перетаскивать, всегда являются простым элементом, просто строковым объектом ...

Мне нужно создать что-то вроде группы элементов, где вы можете перетащить элемент в группу элементов, чтобы добавить его в группу и перетащить группу элементов в целом.

Отсюда мой вопрос: можно ли перетащить элемент dojo.dnd.Source в другой элемент dojo.dnd.Source?

Ответы [ 2 ]

2 голосов
/ 12 марта 2011

Краткий ответ: нет.Многие пытались его исправить, но находили все больше и больше нерабочих крайних случаев, поэтому эти исправления никогда не делали додзё правильным.

Если вам действительно нужно отображать и манипулировать иерархическими данными, рассмотрите вариант Dijit Tree.

0 голосов
/ 02 августа 2011

Проблема заключается в том, что когда вы начинаете перетаскивать и перетаскивать источник дочернего контейнера, все портится.(Не совсем уверен, как).Что вы можете сделать, это скрыть эти дочерние источники, чтобы их события overSource никогда не инициировались:

1) Переопределить функцию checkAcceptance в Source.js.Просто добавьте следующее для if(!flag) return false;:

if(!flag){
    /**
     *  Main Source
     *  - Group 1
     *  -- Child 1
     *  -- Child 2
     *  - Group 2
     */
    var node = dojo.byId(this.node);    
// If the node being moved is the source, skip, but don't hide from view.
if('#'+dojo.attr(source.node, 'id') != '#'+dojo.attr(node, 'id')){
    // If the node being moved is an immediate child of the container, you can move it.
    if(dojo.query('#'+dojo.attr(source.node, 'id') + '>#'+dojo.attr(node, 'id')).length) {
        return true;                
    }

    // If this source is not a parent of the element, hide it.
    if(dojo.query('#'+dojo.attr(node, 'id') + ' #'+dojo.attr(source.node, 'id')).length == 0)
        dojo.addClass(node, 'hiddenSource');                
    }
    return false;
}

2) Вам также необходимо добавить следующее в качестве первой строки в if (this.isDragging) в onMouseMove (важно)

    var node = dojo.byId(this.node);

    // If this is immeditae child, drop it.
    if(dojo.query('#'+dojo.attr(m.source.node, 'id') + '>#'+dojo.attr(node, 'id')).length){
        m.canDrop(true);
            return;
    }

3) Расширенное onDndDrop для удаления добавленного класса для повторного отображения скрытых элементов.

onDndDrop: function(source, nodes, copy, target)
{
    this.inherited(arguments);
    dojo.forEach(dojo.query('.hiddenSource'), 
        function(el){dojo.removeClass(el, 'hiddenSource');}
    );
}

4) Расширьте onDndCancel для выполнения вышеуказанного

onDndCanel: function()
{
    this.inherited(arguments);
    dojo.forEach(dojo.query('.hiddenSource'), 
        function(el){dojo.removeClass(el, 'hiddenSource');}
    );
}

Это неЛучшее решение, поскольку оно скрывает элементы, которые нельзя использовать с текущим элементом, который вы позиционируете, но это сработало для меня.

...