我查看了this link有关dojo拖放功能的教程。但我注意到的一件事是,在所有示例中,要拖动的项目总是一个简单的项目,只是一个字符串对象......
我需要创建类似于项目组的内容,您可以将项目拖动到项目组中以附加到组中,并将项目组作为一个整体拖动。
因此我的问题是,是否可以将dojo.dnd.Source项拖放到另一个dojo.dnd.Source项中?
答案 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');}
);
}
这不是最佳解决方案,因为它隐藏了无法与您定位的当前元素一起使用的元素,但它对我有用。