2015-12-09 97 views
0

我試圖使用jsTree基於父子關係創建2棵樹。要做到這一點,我使用下面的腳本:jsTree確定樹之間的移動和更改複製節點ID

$(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(); 
} 

然而,在移動兩兩棵樹之間的節點時,在「copy_node.jstree」事件總是被調用,即使我移動節點。如果我在同一棵樹中移動節點,我會得到正確的「move_node.jstree」事件。

問題1:有沒有一種方法可以正確確定節點是否在2棵樹之間移動而不是被複制?

問題2:我的節點ID是根據父子關係計算出來的,所以在複製/移動節點之後,我重新計算了這個關係,我想用它來替換節點以前的ID。如果我嘗試修改notifyServerOfChange方法中的data.node.id,則以後不能再選擇該節點。

謝謝

+0

通過在像這樣的方法notifyServerOfChange使用data.instance.set_id解決問題2:如果(data.original)data.instance.set_id(data.node,data.original.id +「 _1" ); –

回答

1

如果移動帶有拖n個墨滴樹與樹之間的節點(因爲它從你使用的插件行),你可以聽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