Проблема заключается в том, что когда вы начинаете перетаскивать и перетаскивать источник дочернего контейнера, все портится.(Не совсем уверен, как).Что вы можете сделать, это скрыть эти дочерние источники, чтобы их события 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');}
);
}
Это неЛучшее решение, поскольку оно скрывает элементы, которые нельзя использовать с текущим элементом, который вы позиционируете, но это сработало для меня.