jsTree确定树之间的移动并更改复制的节点ID

时间:2015-12-09 14:45:10

标签: javascript jstree jstree-dnd

我正在尝试使用jsTree根据父子关系创建2棵树。为此,我使用以下脚本:

$(function () {

   loadTree($('#jstree_indexed_container'), document.getElementById('hiddenFieldIndexedData').value);
   loadTree($('#jstree_nonindexed_container'), document.getElementById('hiddenFieldNonIndexedData').value);

});

function loadTree(jsTreeContainer, stringData) {

   jsTreeContainer.jstree({

      "core": {
         "animation": 0,
         "check_callback": true,
         "themes": { "stripes": true },
         'data': JSON.parse(stringData)
      },
      "plugins": ["contextmenu", "dnd", "search", "wholerow", "unique"]

   });

   jsTreeContainer.on("move_node.jstree", function (e, data) {
      notifyServerOfChange(data, false);
   });

   jsTreeContainer.on("copy_node.jstree", function (e, data) {
      notifyServerOfChange(data, true);
   });

}

function notifyServerOfChange(data, isCopy) {
   var oldParent = getNodeById(data.old_instance, data.old_parent);
   var newParent = getNodeById(data.new_instance, data.parent);

   alert(sprintf("%s node %s from %s to %s. It now has ID: %s", (isCopy ? "Copied" : "Moved"), (data.original != null ? data.original.id : data.node.id), getNodeTitle(oldParent), getNodeTitle(newParent), data.node.id));
}

function getNodeById(jsTreeContainer, id) {
   return jsTreeContainer.element.find("[id='" + id + "']");
}

function getNodeTitle(node) {
   return node.find('a').first().text();
}

但是,在2棵树之间移动节点时,即使我正在移动节点,也始终会调用“copy_node.jstree”事件。如果我在同一棵树中移动节点,我会得到正确的“move_node.jstree”事件。

问题1:有没有办法正确判断节点是否在两棵树之间移动而不是复制?

问题2:我的节点ID是根据父子关系计算的,所以在复制/移动节点后,我重新计算这种关系,我想用它来替换以前的ID节点。如果我尝试修改 notifyServerOfChange 方法中的data.node.id,则之后将无法再选择该节点。

谢谢

1 个答案:

答案 0 :(得分:1)

如果您使用拖放操作在树之间移动节点(因为它来自您使用的插件),您可以收听dnd_stop.vakata事件并检查是否按下了ctrl键:

$(document).on('dnd_stop.vakata', function (e, data) {
    if (data.event.ctrlKey) {
        console.log('copy');
    } else {
        console.log('move');
    }
 });

检查小提琴:JS Fiddle