アイテムを含むdojo.dnd.Sourcesが2つあります。アイテムがドロップされるたびに、xhrを使用してソース内のアイテムの新しい順序を維持する必要があります。Dojo:ドラッグ・アンド・ドロップが終了した後にイベントがありますか
dnd操作が正常終了した後に起動するdojoイベントまたはトピックがありますか?それを使用する最良の方法は何でしょうか?
アイテムを含むdojo.dnd.Sourcesが2つあります。アイテムがドロップされるたびに、xhrを使用してソース内のアイテムの新しい順序を維持する必要があります。Dojo:ドラッグ・アンド・ドロップが終了した後にイベントがありますか
dnd操作が正常終了した後に起動するdojoイベントまたはトピックがありますか?それを使用する最良の方法は何でしょうか?
おそらく私はすべての細部の問題を理解できませんが、なぜイベントやトピックを処理する必要があるのか分かりません。変更を記録する最も良い方法は、関連するソースの更新メソッドを傍受することです。具体的には、滴やその他の追加のために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.
あなたはそれについてスマートにしようとすると全体ではなく、リストのいくつかの差分情報を送信することができますが、それはそれをあなたが持っている—を生成するのはあなた次第ですあなたが必要とするすべてのもの。
ドロップがそうのように終了したときに何かをする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
});
接続メソッドは最後に呼び出されるため、その時点でアイテムがそこにあります。
私はこの問題に取り組む私のようなdojoの人々のためにこのメモを保持しています。私の状況では、ここで与えられた解決策はうまく機能しませんでした。私はDojoツリーでdijit.tree.dndSourceを使用していましたが、 "/ dnd/drop"を購読すると、その時点で基礎データストアが最新の変更で更新されていなくても、イベントをキャプチャできます。 Wiencznyが説明しているように私は待ってみました。待っている仕事をするためにタイムアウトに頼ることができないので、問題を完全には解決しません。ストアの更新に要する時間は、データ構造がどの程度複雑であるかに応じて、短くても非常に長くてもかまいません。私は、dndControllerのonDndDropメソッドをオーバーライドして解決策を見つけました。単にあなたのツリーの初期化でonDndDrop:を指定することができます。あなたがこの方法をつかむことはできませんが、私が奇妙に感じたことの一つは、dnd中に奇妙な行動を起こすことです。私は "/ DND /ドロップ" を使用している場合
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();
}
}
ツリー
方法はドロップ要素がまだ到着していないん。それはまだソースにあります。 setTimeoutを使って欲しいことをするための魔法がいくつか見つかりました。 – Wienczny
私は正確に何を追加するつもりだった。しかし、これを行うためのより良い方法はありませんか?私はdndのツリーの更新に従ってサブパネルを更新したいと思います。確かに速くなければならないし、そこにいくつの木の要素があるのかをあらかじめ決めておくことはできない。私は多くの成功なしで延期して使用しようとしました。どんな助けでも大歓迎です。 – Charith