2012-06-28 9 views
6

El ejemplo en el wiki de Slickgrid para producir un árbol genera datos que están ordenados en el orden exacto que el árbol necesita para dar salida a los padres y a los hijos. Ver: http://mleibman.github.com/SlickGrid/examples/example5-collapsing.html - puede ver por ejemplo que si el padre es la Tarea 1, los hijos son Tarea 2 y Tarea 3, etc.ordenando datos al usar el árbol de slickgrid

¿Cómo le decimos a la red slick cómo ordenar nodos al generar un árbol si los nodos se donan? ¿Tiene una propiedad que se puede usar fácilmente para clasificar los nodos para que los niños sigan inmediatamente a sus padres?

Además, ¿puede una ordenación de soporte de árbol resbaladizo, es decir, cómo funciona eso con el orden de nodo?

Respuesta

1
  1. Tiene que pedir sus datos antes de agregarlos a la red. No hay funciones integradas que puedan entender y ordenar los datos por usted (hasta donde yo sé). Si usa un Binary Search Tree, creo que puede ordenar por hoja de la izquierda. Con otras estructuras de árbol, es probable que haya recorrido demasiado los datos o escriba una consulta SQL recursiva para ordenarla.
  2. Dado que los datos deben pedirse, no hay una manera fácil de admitir la ordenación del árbol. La clasificación básica destruirá tus datos estructurados. Sin embargo, si tiene una propiedad en los datos sortOrder, debería poder ordenar los datos. Si usted tiene todos los nodos de nivel 1 como sortOrder = 1, nivel 2 nodos como sortOrder = 2 y así sucesivamente, primero ordenar por SortOrder y luego por la columna de en orden ascendente o descendente. Consulte Multi column sort para obtener una buena idea de cómo puede hacer esto.

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

Algunas cosas a tener en cuenta si se va a tratar columna de ordenación del árbol:

Si nos fijamos en ejemplo 5 se puede ver que tanto el filtro y la formateador se implementan para que los datos se deben ordenar.

El filtro:

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

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

Y aquí es una parte del formateador:

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

Reescribí éstos a utilizar el actual Identificación en vez de comprobar en contra de la orden de los datos en el dataView. Esto también requiere que revises todos tus datos para ver si el nodo actual tiene hijos. También es necesario reemplazar el dataViewData [IDX] llama:

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

Esto hará que el trabajo del árbol a pesar de que los nodos no están ordenados, pero cuando se expande un nodo, los niños probablemente terminará tras otro nodo donde no residen

Si necesita implementar búsqueda del filtro de encabezado He respondido a otra pregunta here hace unos días.

0

Tengo el mismo problema, con una jerarquía de 3 niveles. Pasé una buena cantidad de tiempo intentando que la solución de Binke funcionara, pero solo resultó en que los elementos de la jerarquía inferior se agruparan, mientras que los de primer y segundo nivel funcionaron bien, pero tuvieron problemas. En última instancia, decidí que lo mejor es que sólo tiene que utilizar la clasificación del lado del servidor, por lo que mi método en especie, literalmente, justamente establece la columna elegida para ordenar y actualiza la cuadrícula:

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

recomiendo lo mismo.

Cuestiones relacionadas