2011-09-05 160 views
5

我遇到了我在MVC2項目中使用的JsTree問題。我想創建一個函數來取消選擇/關閉樹上的所有節點。然後打開一個特定的節點,並選擇一個特定的子節點(我有兩個Id值)。JsTree打開一個節點,然後選擇一個子節點(使用json_result)

問題在於select_node總是在open_node完成之前調用,所以沒有選擇節點,因爲樹還沒有加載數據,並且節點ID不存在。

我第一次嘗試這個功能。

$('#demo3').jstree('deselect_all'); 
$('#demo3').jstree('close_all'); 
$('#demo3').jstree("open_node", $('#ParentId'), false, true); 
$('#demo3').jstree("select_node", $('#ChildId')); 

然後我試着將代碼移動到select_node和move_node綁定樹,但沒有運氣。目前我被卡住了setTimeout(),這是一個可怕的解決方案。

有誰知道我可以告訴樹只有在打開完成後才選擇節點?

回答

7

你可以嘗試通過該選擇節點像一個回調函數:

$('#demo3').jstree('open_node', '#ParentID', function(e, data) { 
    $('#demo3').jstree('select_node', '#ChildId'); 
}, true); 

這樣一旦open_node返回成功select_node將被調用。

1

我目前在一個MVC4項目中使用它。

如果您將open_node函數配置爲加載節點JSON(在「core」插件中將load_open設置爲true),則新添加的節點存在於服務器端,但其DOM元素仍然不是因爲open_node功能沒有完成它的工作。因此,您需要等待或使用第二個參數(成功回調)。在回調中,在DOM樹中呈現的新節點及其選擇器有效。

jsTree配置示例:

"core": { 
    "open_parents": true, 
    "load_open": true 
} 

我的工作代碼:

$("iframe#UploadTarget").load(function() { 
    var result = jQuery.parseJSON($(this).contents().text()); 
    if (result.Result == true) { 
    $("#uploadDialog").dialog("close"); 
    var tree = jQuery.jstree._focused(); 

    /* 
     open_node will open the parent, get the childs from the server 
     (controller) and renders the new item before the callback executed, 
     so the jQuery selector will be valid 
    */ 

    tree.open_node(result.ParentId,/*CALLBACK*/ function() { 
      var newNode = $("#" + result.Id); 
      tree.select_node(newNode, false, null); 
    }); 

    } else { 
     alert(result.Result + ":" + result.ResultDescription); 
    } 

});//GOOD LUCK :-) 
1

希望這能幫助和抱歉,我沒有使用JSON。我將jstree與函數一起使用,通過單擊jstree html外部的元素來打開節點。

我們設置中的每個節點都像一個網頁,所以在儀表板的主頁上我們有最近編輯過的頁面列表。

每這些鏈接的

有這個JavaScript的執行

<a href="javascript: selectLeftNavNode(339);">Edit</a> 

,其中339是我們要編輯

頁的ID,這是用來執行

function selectLeftNavNode(node) { 
     $('#demo').jstree('deselect_all'); 
     $('#demo').jstree('select_node', '#node_' + node); 
} 
FHE功能

我們最近注意到的問題是,如果最近編輯的頁面在樹中更深處,更具體地在尚未加載的段中,則將失敗

這就是爲什麼我決定把AJAX請求到服務器,以便檢索所有父ID的

改下面的代碼,在我的情況下,阿賈克斯將返回這樣的事情找XML

<?xml version="1.0" encoding="UTF-8"?> 
<response> 
<paths> 
<path>339</path> 
<path>338</path> 
<path>38</path> 
</paths> 
</response> 

和功能

function selectLeftNavNode(node) { 
     $('#demo').jstree('deselect_all'); 
     if($('#demo').jstree('select_node', '#node_' + node) === false) 
     { 
      // if it is false means that the node is not yet rendered 
      // so instead of loading we will require to get list of parent nodes to open in order, then it will become available 
      // an ajax call should get us all the nodes 
      $.ajax({ 
       type: "POST", 
       dataType: "xml", 
       url: your_url_to_php_script', 
       data: {node_id:node}, 
       success: function(data) 
       { 
        var remaining_nodes = new Array(); 
        var paths_count = $(data).find('response').find('path').length; 
        for(var x=1;x<=paths_count;x++){ 
         remaining_nodes[x-1] = $(data).find('response').find('paths path:nth-child('+x+')').text(); 
        } 

        open_nodes_step_by_step(remaining_nodes); 
       } 
      }); 
     } 
    } 

和在除了其通過環繞在從open_node回調的函數,該函數通過節點打開節點和當它擊中噸他最後一項,應該是我們要選擇它將使用select_node實際節點ID而不是

function open_nodes_step_by_step(remaining_nodes) 
{ 
    var nodes = remaining_nodes.slice(); 
    tree = jQuery.jstree._focused(); 
    if(nodes.length > 1){ 
     var nodes_left = remaining_nodes.slice(); 
     nodes_left.pop(); 
     var to_open = nodes.length - 1; 
     tree.open_node(document.getElementById('node_' + nodes[to_open]), /*CALLBACK*/ function() { 
      open_nodes_step_by_step(nodes_left); 
     }); 
    } 
    else{ 
     tree.select_node('#node_' + nodes[0]); 
    } 
} 

我已經測試了我的IE8,FF和鉻一切似乎工作得很好,在我之上的解決方案使用jQuery v1.10.1和jsTree 1.0-rc1(不幸的是,代碼已經存在多年了,它擁有所有數據庫和其他集成,我決定不更改爲新版本,它的工作原理)

希望我幫助過有人

湯姆

相關問題