Dojo dnd目标和页面加载

时间:2012-05-04 21:54:57

标签: dojo shopping-cart target drag-and-drop

我的问题与http://www.sitepen.com/blog/2011/12/05/dojo-drag-n-drop-redux/发布的dnd示例(第4步:收听事件)有关。

在我的情况下,我有多个跨越多个页面的dnd源。如何在购物车(目标)中记录数据,以便在加载不同页面后其中的项目不会消失,并且用户可以继续删除更多项目?

任何提示都将不胜感激!

2 个答案:

答案 0 :(得分:1)

请参阅dojotoolkit.org

然而,似乎文档不是1.7列表的上游;

订阅一组主题,您将知道何时/什么是悬垂

dojo.topic.subsribe

  • / dnd / 开始:当DnD启动时。当前源,节点和复制标志 (请参阅Manager的startDrag()以获取更多信息)作为参数传递 这个事件。
  • ./ dnd / source / over :当鼠标在源上移动时。来源于 问题作为参数传递。当时,同样的事件被提出 鼠标走出了源头。在这种情况下,null作为a传递 参数。
  • / dnd / 下降/之前:在下降之前提出。它可以用来 捕获丢弃参数。参数与for相同 / DND /降。
  • / dnd / drop :提升以执行放弃。前三个参数是 与/ dnd / start相同。第四个参数是目标 宾语。请注意,在处理此事件期间,节点可以是 已经移动或重复使用。如果您需要原始节点,请使用 / dnd / drop /之前捕获它们,或使用本地事件 源/目标对象。
  • / dnd / 取消:当用户取消DnD时(通过点击Esc), 或者将物品放在非法的位置。这个话题没有 参数。

主题订阅示例:

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的工作方式就像您订阅了邮件列表一样,一旦有新闻就会收到邮件

答案 1 :(得分: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