道场:拖后是否有事件发生完了

时间:2009-07-15 23:01:19

标签: dojo events drag-and-drop

我有两个带项目的dojo.dnd.Sources。每当一个项目被删除时,我需要使用xhr持久保存Sources中项目的新顺序。

在dnd操作完成(成功)后是否会触发dojo事件或主题?什么是最好的使用方式?

3 个答案:

答案 0 :(得分:3)

可能我不了解所有细节中的问题,但我不明白为什么你需要处理事件或主题。记录更改的最佳方法是拦截相关来源的更新方法。具体而言,您需要拦截insertNodes()以进行删除或任何其他添加。

简单示例(伪代码):

var source1, source2;
// ...
// initialize sources
// populate sources
// ...

function getAllItems(source){
  var items = source.getAllNodes().map(function(node){
    return source.getItem(node.id);
  });
  return items;
}

function dumpSource(source){
  var items = getAllItems(source);
  // XHR items here to your server
}

function recordChange(){
  // now we know that some change has occured
  // it could be a drop or some programmatic updates
  // we don't really care
  dumpSource(source1);
  dumpSource(source2);
}

dojo.connect(source1, "insertNodes", recordChanges);
dojo.connect(source2, "insertNodes", recordChanges);
// now any drop or other change will trigger recordChanges()
// after the change has occurred.

你可以尝试聪明一点并发送一些差异信息而不是整个列表,但是由你来生成它 - 你拥有所需的一切。

答案 1 :(得分:1)

您可以使用dojo.subscribe执行某项操作,例如:

dojo.subscribe("/dnd/drop", function(source, nodes, copy, target) {
  // do your magic here
});

dojotoolkit tests site上有使用订阅的示例。有关dojo publishsubscribe的更多信息。

或者,您可以连接到onDndDrop方法。

var source = new dojo.dnd.Source( ... );
dojo.connect( source, "onDndDrop", function( source, nodes, copy, target ) {
  // make magic happen here
});

最后调用connect方法,这样项目就在那里。

答案 2 :(得分:0)

我正在为dojo树人保留这个笔记,就像我一样会遇到这个问题。这里给出的解决方案在我的情况下效果不佳。我正在使用带有Dojo树的dijit.tree.dndSource并订阅“/ dnd / drop”允许我捕获事件,即使此时我的基础数据存储尚未使用最新更改进行更新。所以我试着等待Wienczny解释,这并没有完全解决问题,因为我不能依靠超时来做等待工作。存储更新所需的时间可能会有所不同,即更短或很长取决于数据结构的复杂程度。我找到了覆盖dndController的onDndDrop方法的解决方案。只需在树初始化时指定onDndDrop即可。有一件事我觉得奇怪,虽然你不能搭便车,你会在dnd期间得到奇怪的行为。

                this._tree = new MapConfigTree({
                checkAcceptance: this.dndAccept,
                onDndDrop: this.onDndDrop,
                betweenThreshold:5,

方法

            onDndDrop : function(source, nodes, copy, target){
            if(source.dropPosition === 'Over' && (target.targetAnchor.item.type[0] == 'Test layer')) {
                this.inherited(arguments);
                // do your bit here 
            } else {
                this.onDndCancel();
            }   
        }