dojo.dnd.Source对象是否可以包含另一个dojo.dnd.Source对象作为子节点之一?

时间:2011-03-03 09:23:20

标签: drag-and-drop dojo

我查看了this link有关dojo拖放功能的教程。但我注意到的一件事是,在所有示例中,要拖动的项目总是一个简单的项目,只是一个字符串对象......

我需要创建类似于项目组的内容,您可以将项目拖动到项目组中以附加到组中,并将项目组作为一个整体拖动。

因此我的问题是,是否可以将dojo.dnd.Source项拖放到另一个dojo.dnd.Source项中?

2 个答案:

答案 0 :(得分:2)

简答:不。许多人试图修补它,但发现越来越多的非工作边缘情况,所以这些补丁从来没有使Dojo适当。

如果您确实需要显示和操作分层数据,请考虑树Dijit。

答案 1 :(得分:0)

问题是,当你开始拖动并拖动子容器的Source时,一切都搞砸了。 (不完全确定如何)。您可以做的是隐藏这些子源,以便它们的overSource事件永远不会触发:

1)覆盖Source.js中的checkAcceptance函数。刚为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)你还需要在onMouseMove(重要)的if(this.isDragging)下添加以下内容作为第一行

    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');}
    );
}

这不是最佳解决方案,因为它隐藏了无法与您定位的当前元素一起使用的元素,但它对我有用。