我已查看了this link以獲取有關dojo拖放功能的教程。但有一點我注意到,在所有例子中,被拖動的項目總是一個簡單的項目,只是一個字符串對象...dojo.dnd.Source對象是否可以包含另一個dojo.dnd.Source對象作爲其中一個子節點?
我需要創建類似項目組的東西,你可以將項目拖放到項目組中以追加到組中,並將項目組作爲一個整體拖動。
因此我的問題是否可以將dojo.dnd.Source項目拖放到另一個dojo.dnd.Source項目中?
我已查看了this link以獲取有關dojo拖放功能的教程。但有一點我注意到,在所有例子中,被拖動的項目總是一個簡單的項目,只是一個字符串對象...dojo.dnd.Source對象是否可以包含另一個dojo.dnd.Source對象作爲其中一個子節點?
我需要創建類似項目組的東西,你可以將項目拖放到項目組中以追加到組中,並將項目組作爲一個整體拖動。
因此我的問題是否可以將dojo.dnd.Source項目拖放到另一個dojo.dnd.Source項目中?
簡答:沒有。許多人試圖修補它,但發現越來越多的非工作邊緣案例,所以這些修補程序從未成爲Dojo的正確之物。
如果您確實需要顯示和操作分層數據,請考慮Tree Dijit。
問題是,當你開始拖動並拖動子容器的源時,一切都會搞砸。 (不完全確定如何)。你可以做的是隱藏這些孩子的來源,使他們的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)您還需要添加以下彷彿(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');}
);
}
這不是最好的解決方案,因爲它隱藏不能與要定位的當前元素被使用的元素,但它爲我工作。
我明白了。感謝您的信息。樹dijit似乎足夠做我需要的東西。 – Hery 2011-03-14 02:11:23