Dojo dnd(拖放)1.7.2 - 如何维护一个单独的(非dojo-dnd)列表?

时间:2012-07-10 20:34:32

标签: dojo drag-and-drop dojo-dnd

我正在使用Dojo dnd 1.7.2版本,它通常运行良好。我很高兴。

我的应用程序维护了许多项目数组,当用户拖放项目时,我需要确保更新我的数组以反映用户看到的内容。

为了实现这一目标,我想我需要在Source周围运行一些代码。onDndDrop

如果我使用dojo.connectonDndDroponDrop的源代码上设置处理程序,我的代码似乎来得太迟了。也就是说,传递给处理程序的source实际上不再包含该项。

这是一个问题,因为我想调用source.getItem(nodes[0].id)来获取被拖动的实际数据,这样我就可以在我的数组中找到它并更新这些数组以反映用户所做的更改。

也许我正在犯这个错误;还有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

好的,我发现了一个很好的方法。在这个答案中找到了一个不同问题的提示: https://stackoverflow.com/a/1635554/573110

我成功的通话顺序基本上是:

var source = new dojo.dnd.Source( element, creationParams );
var dropHandler = function(source,nodes,copy){
  var o = source.getItem(nodes[0].id); // 0 is cool here because singular:true.
  // party on o.data ...
  this.oldDrop(source,nodes,copy);
}
source.oldDrop = source.onDrop;
source.onDrop = dropHandler;

这可确保在先前安装的onDrop之前调用dropHandler({{1}})的新实现。

答案 1 :(得分:-1)

有点拍摄空白我想,dndSource有几种不同的实现方式。但是有一些事情需要知道在mouseover / dnddrop期间调用的事件/检查功能。

一种方法是为您可能拥有的任何目标设置checkAcceptance(source, nodes)。然后保留当前拖动的节点的引用。但是,使用具有动态内容的多个容器会变得棘手。

设置您的来源,同时覆盖checkAcceptance并使用已知的(可能是全局的)变量来跟踪。

var lastReference = null;
var target = dojo.dnd.Source(node, {
    checkAcceptance(source, nodes) : function() {
        // this is called when 'nodes' are attempted dropped - on mouseover
        lastReference = source.getItem(nodes[0].id)
        // returning boolean here will either green-light or deny your drop
        // use fallback (default) behavior like so:
        return this.inhertied(arguments);
    }
});

最佳方法可能就是这样 - 你手头有目标和源加节点,但是你需要找出哪个是正确的堆栈来寻找节点。我相信它是在同一时间发布的。你已经在使用的事件(onDrop):

dojo.subscribe("/dnd/drop", function(source, nodes, copy, target) {
  // figure out your source container id and target dropzone id
  // do stuff with nodes
  var itemId = nodes[0].id
}

此处列出了通过dojo.subscribe和事件提供的可用机制/主题 http://dojotoolkit.org/reference-guide/1.7/dojo/dnd.html#manager