3

私の質問は、 http ://www.sitepen.com/blog/2011/12/05/dojo-drag-n-drop-redux/ に投稿された dnd の例 (ステップ 4: イベントのリッスン) に関連しています。

私の場合、複数のページにまたがる複数の dnd ソースがあります。ショッピング カート (ターゲット) にデータを記録して、別のページを読み込んだ後にその中のアイテムが消えないようにし、ユーザーがさらに多くのアイテムをドロップし続けることができるようにするにはどうすればよいですか?

Any hints would be greatly appreciated!

4

2 に答える 2

1

dojotoolkit.orgを参照

ただし、ドキュメントは 1.7 リストのアップストリームではないようです。

一連のトピックを購読すると、いつ/何がドラップされるかがわかります

dojo.topic.subscribe

  • /dnd/ start : DnD の開始時。現在のソース、ノード、およびコピー フラグ (詳細については、Manager の startDrag() を参照) が、このイベントのパラメーターとして渡されます。
  • ./dnd/ source/over : マウスがソース上に移動したとき。問題のソースはパラメーターとして渡されます。マウスがソースの外に出ると、同じイベントが発生します。この場合、null がパラメーターとして渡されます。
  • /dnd/ drop/before : ドロップの直前に発生します。ドロップ パラメータをキャプチャするために使用できます。パラメータは /dnd/drop と同じです。
  • /dnd/ drop : ドロップを実行するために発生します。最初の 3 つのパラメーターは、/dnd/start の場合と同じです。4 番目のパラメーターはターゲット オブジェクトです。このイベントの処理中に、ノードはすでに移動または再利用されている可能性があることに注意してください。元のノードが必要な場合は、/dnd/drop/before を使用してそれらをキャプチャするか、ソース/ターゲット オブジェクトに対してローカルなイベントを使用します。
  • /dnd/ cancel : ユーザーによって (Esc を押すことによって)、またはアイテムを違法な場所にドロップすることによって、DnD がキャンセルされたとき。このトピックにはパラメーターがありません。

トピック サブスクリプションの例:

dojo.subscribe("dnd/start", function(source, nodes, copy) {
  // see dojo.dnd.startDrag documentation for details
  // this event will process when user picks up a dnditem
  console.log("Arguments:", arguments);

};
dojo.subscribe("dnd/drop", function(source, nodes, copy, target) {
  // see dojo.dnd.startDrag documentation for details
  // this event will process when user releases dnditem on a valid target
  // note the extra parameter, target - in 99% cases a DOM node
  console.log("Arguments:", arguments);
});

ユーザーがアイテムをピックアップすると、dndmanager が dojo.publish("dnd/start", this.source, this.selection, this.bCopy) を呼び出します。トピックをサブスクライブすると、通知が届きます。

dojo.topic は、メーリング リストに登録しているかのように機能し、ニュースが利用可能になるとメールを受け取ります。

于 2012-05-05T09:17:57.123 に答える
0

ユーザーが購入するために選択したアイテムでカートを初期化したい場合、ドロップするたびに

<script>
    function dropped(source, nodes, copy, target) {
      if(target.id == "myCardId") {
        var list = dojo.cookie("mycart");
        // split or initialize list (delimiter : comma)
        list = list = "" ? [] : list.split(",");
        if(dojo.indexOf(nodes[0].id), list) != -1)
           // allready there, return
           return;
        else {
           // combine list with every dropped node
           dojo.forEach(nodes, function(dropItem) { list.push(dropItem.id); });
           // set cookie with new variable
           dojo.cookie("mycart", list.join(",");
        }
      }
    }

    ....
   dojo.subscribe("dnd/drop", dropped);
</script>

このようにPHPで実装できますが、例のためにアイテムビューを取得する方法について詳しくは説明しませんが、db_dataにそれらがあります。

<?php

if(isset($_COOKIE) && !empty($_COOKIE['mycart'])) {
   $cartContents = "<ul class=\"dndContainer\">";
   foreach(explode(",", $_COOKIE['mycart']) as $id)
      $cartContents .= "<li class=\"dndItem\">".$db_data[$id]->title."</li>";
   $cartContent .= "</ul>";
}
?>
<div id="dragSource"><? print generateView(); ?></div>
<div id="myCartId"><? print $cartContents; ?></div>

または、大きなカートの場合、Cookie は過剰で、ヘッダーが乱雑になります。上記のスクリプトは ID とサーバーを含む XHR を送信し、javascript と同じロジックを使用してそれをセッションに追加できます。その場合は、$_COOKIE を $_SESSION に置き換えるだけです。

于 2012-05-07T18:30:05.333 に答える