2012-06-28 32 views
6

Ví dụ trên wiki slickgrid để sản xuất cây tạo ra dữ liệu được sắp xếp theo thứ tự chính xác mà cây cần để xuất ra cha mẹ và con cái. Xem: http://mleibman.github.com/SlickGrid/examples/example5-collapsing.html - bạn có thể xem ví dụ rằng nếu cha mẹ là Nhiệm vụ 1, trẻ em là Nhiệm vụ 2 và Nhiệm vụ 3, v.v.đặt hàng dữ liệu khi sử dụng cây slickgrid

Làm cách nào để chúng tôi nói với lưới slick cách đặt nút khi xuất ra cây nếu nút không có một tài sản có thể dễ dàng được sử dụng để sắp xếp các nút để trẻ em ngay lập tức theo cha mẹ của họ?

Ngoài ra, có thể phân loại hỗ trợ cây bóng bẩy, tức là cách chơi với thứ tự nút?

Trả lời

1
  1. Bạn phải đặt hàng dữ liệu của mình trước khi thêm nó vào lưới. Không có sẵn chức năng có thể hiểu và sắp xếp dữ liệu cho bạn (theo như tôi biết). Nếu bạn sử dụng Binary Search Tree, tôi nghĩ bạn có thể sắp xếp theo lá bên trái. Với các cấu trúc cây khác, bạn có thể có quá vòng lặp thông qua dữ liệu hoặc viết một truy vấn SQL đệ quy để sắp xếp nó.
  2. Vì dữ liệu cần phải được sắp xếp, không có cách nào dễ dàng để hỗ trợ phân loại cây. Việc sắp xếp cơ bản sẽ phá hủy dữ liệu có cấu trúc của bạn. Tuy nhiên, nếu bạn có thuộc tính trên dữ liệu sortOrder, bạn sẽ có thể sắp xếp dữ liệu. Nếu bạn có tất cả các nút cấp 1 là sortOrder = 1, nút cấp 2 là sortOrder = 2 và cứ như vậy, trước tiên hãy sắp xếp theo sắp xếp và sau đó theo cột theo thứ tự tăng dần hoặc giảm dần. Kiểm tra Multi column sort để hiểu rõ cách bạn có thể thực hiện việc này.

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

Một số điều cần lưu ý nếu bạn đang cố gắng cột sắp xếp cây:

Nếu bạn nhìn vào dụ 5 bạn có thể thấy rằng cả lọcđịnh dạng được triển khai để dữ liệu cần được sắp xếp.

Bộ lọc:

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

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

Và đây là một phần của định dạng:

//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 { 
    //....... 
    } 
} 

Tôi viết lại những sử dụng thực tế id thay vì kiểm tra chống lại thứ tự của các dữ liệu trong dataView. Điều này đòi hỏi bạn quá vòng lặp thông qua tất cả dữ liệu của bạn để xem liệu nút hiện tại có bất kỳ trẻ em nào không. Bạn cũng cần phải thay thế dataViewData [idx] gọi:

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

này sẽ làm cho công việc cây mặc dù các nút không được sắp xếp, nhưng khi mở rộng một nút, những đứa trẻ có thể sẽ kết thúc sau khi một nút khác , nơi họ không cư trú.

Nếu bạn cần triển khai tìm kiếm bộ lọc tiêu đề Tôi đã trả lời một câu hỏi khác here cách đây vài ngày.

0

Tôi có cùng một vấn đề với hệ thống phân cấp 3 cấp. Tôi đã dành nhiều thời gian để cố gắng giải pháp của Binke nhưng nó chỉ dẫn đến các yếu tố phân cấp thấp hơn nhóm lại với nhau, trong khi các cấp độ thứ nhất và thứ hai được phân loại nhưng có vấn đề. Cuối cùng tôi quyết định rằng cách tốt nhất là chỉ cần sử dụng server-side phân loại, và vì vậy phương pháp on-loại của tôi theo nghĩa đen chỉ đặt cột được lựa chọn để sắp xếp theo và làm mới lưới điện:

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

Tôi khuyên bạn nên giống nhau.

Các vấn đề liên quan