2012-06-28 42 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(); 
}); 

我建议相同。