我有两个带项目的dojo.dnd.Sources。每当一个项目被删除时,我需要使用xhr持久保存Sources中项目的新顺序。
在dnd操作完成(成功)后是否会触发dojo事件或主题?什么是最好的使用方式?
答案 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 publish和subscribe的更多信息。
或者,您可以连接到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();
}
}