I'm using Dojo dnd version 1.7.2 and it's generally working really well. I'm happy.

My app maintains many arrays of items, and as the user drags and drops items around, I need to ensure that my arrays are updated to reflect the contents the user is seeing.

In order to accomplish this, I think I need to run some code around the time of Source.onDndDrop

If I use dojo.connect to set up a handler on my Source for onDndDrop or onDrop, my code seems to get called too late. That is, the source that's passed to the handler doesn't actually have the item in it any more.

This is a problem because I want to call source.getItem(nodes[0].id) to get at the actual data that's being dragged around so I can find it in my arrays and update those arrays to reflect the change the user is making.

Perhaps I'm going about this wrong; and there's a better way?

有帮助吗?

解决方案

Ok, I found a good way to do this. A hint was found in this answer to a different question: https://stackoverflow.com/a/1635554/573110

My successful sequence of calls is basically:

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;

This ensures that the new implementation of onDrop (dropHandler) is called right before the previously installed one.

其他提示

Kind'a shooting a blank i guess, there are a few different implementations of the dndSource. But there are a some things one needs to know about the events / checkfunctions that are called during the mouseover / dnddrop.

One approach would be to setup checkAcceptance(source, nodes) for any target you may have. Then keep a reference of the nodes currently dragged. Gets tricky though, with multiple containers that has dynamic contents.

Setup your Source, whilst overriding the checkAcceptance and use a known, (perhaps global) variable to keep track.

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

Best approach might just be like this - you get both target and source plus nodes at hand, however you need to find out which is the right stack to look for the node in. I believe it is published at same time as the event (onDrop) youre allready using:

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
}

Available mechanics/topics through dojo.subscribe and events are listed here http://dojotoolkit.org/reference-guide/1.7/dojo/dnd.html#manager

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top