与Dojo Moveable一起使用Dojo拖放

与Dojo Moveable一起使用Dojo拖放,dojo,drag-and-drop,dojo-dnd,Dojo,Drag And Drop,Dojo Dnd,我正在使用Dojo.dnd在区域之间传输项目。问题是:一旦我放下物品,它们就会卡入原位,但我想让它们留在我放下它们的地方,但只在一个区域 这里有一个小代码可以更好地解释这一点: <div id="dropZone" class="dropZone"> <div id="itemNodes"></div> <div id="targetZone" dojoType="dojo.dnd.Source"></div>

我正在使用Dojo.dnd在区域之间传输项目。问题是:一旦我放下物品,它们就会卡入原位,但我想让它们留在我放下它们的地方,但只在一个区域

这里有一个小代码可以更好地解释这一点:

  <div id="dropZone" class="dropZone">
    <div id="itemNodes"></div>
    <div id="targetZone" dojoType="dojo.dnd.Source"></div>
  </div>
但是这样我就有了两个物品列表,放入“targetZone”的物品不会停留在我丢弃它们的地方。我尝试了一个循环
dojo.query(“.dojodnitem”).forEach(函数(节点)
,以获取所有项目并将其更改为“可移动”类型:

  • 使用
    dojo.dnd.move.constrainedMoveable
    将更改项目,使其始终可以移动(即使在“itemNodes”中)
  • 使用
    dojo.dnd.move.boxConstrainedMovable
    并将“框”定义为“targetZone”的边界,就可以在“targetZone”内移动项目,但一旦我放下它们,就无法抓取并将其移回。(奇怪:
    dojo.connect(节点,“onMoved”)
    在这里不起作用,无论发生什么,连击炮都不会开火。)
因此,问题是:是否可以创建两个dnd.Source,在其中我可以来回移动项目,并让项目仅在其中一个源中“可移动”?
或者是否有一种解决方法,例如使项目可移动,如果它们没有被放入“targetZone”,它们将自动移回“itemNodes”中的列表

提交页面后,我必须保存已放置到“targetZone”中的每个项目的位置。(下一步将在页面加载时将项目放置在“targetZone”中,如果之前已经填充了网格,但我很乐意首先让它工作。)

任何暗示都将不胜感激


您好,选择0r

这类功能没有直接的支持。可以使用自定义代码来实现,例如,通过对
源代码进行子类化,并覆盖其
插入节点()
以下是一个快速解决方法来实现此功能:

最后,我只使用了一个DIV,它是一个
dojo.dnd.Source
,包含应该放入“dropZone”并在其中四处移动的项目,同时在放置到dropZone之外时捕捉回项目列表

所有项目都是一个
dojo.dnd.move.parentConstrainedMoveable
,以使它们在原始分区中可移动。连接到
onMoveStop
将使我有机会决定是否在dropZone或其他地方发生了“丢弃”

  if (coordX >= (dropCoords.l + dropAreaX)  &&
      coordX <= (dropCoords.l + dropAreaX + dropAreaW) &&
      coordY >= (dropCoords.t + dropAreaY) &&
      coordY <= (dropCoords.t + dropAreaY + dropAreaH))
  {
     // OK!
  }
  else
  {
    // outside, snap back to list
  }
if(coordX>=(dropCoords.l+dropAreaX)&&
coordX=(dropCoords.t+dropAreaY)&&

coordY太糟糕了,不过无论如何还是要谢谢你。我想,一旦我被一个定制的解决方案困住了,我会马上提出另一个问题:)
  if (coordX >= (dropCoords.l + dropAreaX)  &&
      coordX <= (dropCoords.l + dropAreaX + dropAreaW) &&
      coordY >= (dropCoords.t + dropAreaY) &&
      coordY <= (dropCoords.t + dropAreaY + dropAreaH))
  {
     // OK!
  }
  else
  {
    // outside, snap back to list
  }