2012-06-28 40 views
6

生成樹的slickgrid wiki上的示例生成的數據按照樹需要輸出父母和子女的確切順序排序。請參閱:http://mleibman.github.com/SlickGrid/examples/example5-collapsing.html - 例如,你可以看到,如果父母是任務1,孩子們任務2和任務3等使用slickgrid樹時的訂購數據

我們如何告訴光滑電網如何輸出樹時訂購的節點,如果節點唐沒有可以輕易用於分類節點的屬性,以便孩子立即跟隨父母?

此外,一個光滑樹支持排序,即如何發揮節點順序?

回答

1
  1. 您必須在將數據添加到網格之前對數據進行排序。沒有內置函數可以理解和排序你的數據(據我所知)。如果您使用Binary Search Tree,我認爲您可以按左葉排序。對於其他樹結構,您可能會循環遍歷數據或編寫遞歸SQL查詢來對其進行排序。
  2. 由於數據需要排序,所以沒有簡單的方法來支持樹的排序。基本的排序會破壞你的結構化數據。但是,如果您對數據sortOrder有財產,則應該可以對數據進行排序。如果你擁有所有一級節點作爲中將sortOrder = 1,二級節點作爲中將sortOrder = 2等,通過排序順序,然後在升序或降序排列第一排序。請檢查Multi column sort以瞭解如何執行此操作。

    grid.onSort.subscribe(function (e, args) { 
        var cols = args.sortCols; 
    
        data.sort(function (dataRow1, dataRow2) { 
         //first sort by your parameter, then combine it with example sort: 
         var sortOrderResult = (dataRow1["sortOrder"] == dataRow2["sortOrder"] ? 0 
         : (dataRow1["sortOrder"] > dataRow2["sortOrder"] ? 1 : -1)); 
    
         if(sortOrderResult != 0) 
          return sortOrderResult; 
         else { 
          var field = cols[i].sortCol.field; 
          var sign = cols[i].sortAsc ? 1 : -1; 
          var value1 = dataRow1[field], value2 = dataRow2[field]; 
          var result = (value1 == value2 ? 0 : (value1 > value2 ? 1 : -1)) * sign; 
          if (result != 0) { 
           return result; 
          } 
         } 
        } 
    }); 
    

有些事情要考慮,如果你想嘗試列排序樹:

如果你看看例如5,你可以看到,無論是過濾格式化程序被實現以便數據需要被排序。

過濾器:

//part of the filter. 
var parent = dataViewData[item.parent]; 

while (parent) { 
    if (parent._collapsed) { 
     parent._collapsed = false; 
    } 
    parent = dataViewData[parent.parent]; 
} 

而這裏的格式化的一部分:

//part of the formatter for showing collapse/open nodes 
if (dataViewData[idx + 1] && dataViewData[idx + 1].indent > dataViewData[idx].indent) { 
    if (dataContext._collapsed) { 
     return spacer + " <span class='toggle expand'></span>&nbsp;" + value; 
    } else { 
    //....... 
    } 
} 

我重寫這些使用實際ID,而不是檢查,對在該數據的順序dataView。這需要您循環遍歷所有數據,以查看當前節點是否有子節點。您還需要更換dataViewData [IDX]電話:

//instead of dataViewData[item.parent]; 
var parent = dataView.getItemById(item.parent); 

這將使樹工作,即使節點不排序,而是擴展一個節點時,孩子可能會另一個節點後結束,他們不居住。

如果您需要實施標題篩選器搜索我在幾天前回復了另一個問題here

0

我有同樣的問題,與3級的層次結構。我花了大量的時間試圖讓Binke的解決方案發揮作用,但它只是導致較低層次的元素組合在一起,而一級和二級的元素分類工作但存在問題。最後我決定,這是最好還是使用服務器端的排序,所以我的排序方法真的只是設置所選列進行排序,並刷新網格:

grid.onSort.subscribe(function(e, args) { 
    sortColumn = args.sortCol.field; 
    refreshCasesList(); 
}); 

我建議相同。