2017-09-06 64 views
0

我使用this plugin來顯示一棵樹。引導樹視圖性能問題

是否有任何功能會檢查父節點時檢查所有子節點?

目前我找不到任何方式來做到這一點。

爲了實現這個功能我已經寫遞歸函數找到根下的每個節點,並檢查使用checkNode功能。

我看到的性能問題時,樹的深度超過3大約150個節點。在調查中發現checkNode功能bootstrap-treeview.js使用render每次檢查節點時,誰能告訴我使用這個render函數?

我們可以刪除使用render

回答

0

我用性能使用遞歸溶液以及掙扎,但我發現一種更有效的替代方案。到checkAll呼叫速度快,即使有大的樹,因爲它只能在render單呼,而遞歸實現使用checkNode此檢查將調用render多次不必要的,正如你所指出。

的文檔中我找不到這一點,但我注意到,checkNode電話forEachIdentifier在其執行情況,checkAll一樣的,所以實際上你可以通過在節點或nodeIds的陣列,而不是隻是一個單一的節點ID,在檢查完所有節點後,它只會調用render一次。 checkAll的唯一區別在於它特別傳遞樹中的所有nodeIds。

因此,您可以在事件處理程序中添加一些代碼,通過查看最後一個子節點的ID並構建一個範圍,然後調用checkNode一次,爲父級下的所有節點生成nodeIds列表。

function onNodeChecked(event, node_data) { 
    var first_index, last_index, last_node, nodes, range, i; 
    nodes = node_data.nodes; 
    if (nodes != null) { 
     first_index = node_data.nodeId; 
     last_node = nodes[nodes.length - 1]; 
     while (last_node.nodes != null) { 
     nodes = last_node.nodes; 
     last_node = nodes[nodes.length - 1]; 
     } 
     last_index = last_node.nodeId; 
     range = []; 
     for (i = first_index; i <= last_index ; i++) { 
     range.push(i); 
     } 
     return $('#tree').treeview('checkNode', [range, {silent: true}]); 
    } 
} 

編輯:修改代碼以正確處理最後一個孩子有孩子的情況。