花式树。如何限制拖动的可能性?

Fancytree. How to limit dragging possibilities?

我打算将 fancytree 用于 creating/editing 菜单类别的商品。我在我的数据库中使用嵌套集原则 (MySQL)。如果按照这个原则的话,我需要通过以下方式来限制拖动。我希望树叶只能放置在只有树叶的层级。换句话说,我希望没有 children 的元素只能放置到具有相同元素但没有 children 元素的水平。如果目标级别至少有一个具有 children 的元素,我想禁止这种拖动。我该怎么做?

简而言之:拖放是否合格由传递给 dnd 扩展启动选项的 dragStartdragEnter 函数决定:

DnD 扩展文档用代码总结;下面省略了一些细节:

dragStart: function (node, data) {
  // Return false to cancel dragging of node.
  // if( node.isFolder() ) { return false; }

  return true;
},

dragEnter: function (node, data) {
  // Return false to disallow dropping on node.
  // E.g., Prevent dropping a parent below another parent (only sort
  // nodes under the same parent):
  // if (node.parent !== data.otherNode.parent) {
  //   return false;
  // }

  // Don't allow dropping *over* a node (would create a child). Just
  // allow changing the order:
  // return ["before", "after"];

  // Accept everything:
  return true;
},

我不太明白您的业务逻辑,但您似乎只需要检查当前和目标节点子属性的某种组合。我可能会考虑将该数据放入 FancytreeNode 对象以避免一直重新计算。

这里有一些印第安纳琼斯的工作:

我有类似的问题(限制 children 仅限于文件夹,没有 children 用于文件)并且在阅读了一些文档之后,得到了答案:

仅限 children 到文件夹:

dragEnter: function(node, data) {
            if(node.isFolder()){
             return true;
            }
             return 'before';
            },

将 children 限制为最大级别 2:// 0 - 根,1 - 第一个可见

dragEnter: function(node, data) {
            if(node.getLevel() < 2){
             return true;
            }
             return 'before';
            },