2016-10-20 5 views
0

У меня есть таблица dgrid, состоящая из 13 столбцов.Сортировка столбца dgrid не работает должным образом

Сортировка в порядке убывания работает должным образом: наивысшие значения, за которыми следуют наименьшие значения, за которыми следуют записи, которые не имеют значений.

Однако, когда я сортирую в порядке возрастания, есть поля без значений, затем поля с 0, затем поля без значений снова и, наконец, поля со значениями в порядке возрастания.

Я изучил исходный код, но я не могу понять, что вызывает это.

Это ошибка с сортировкой dgrid?

Что может быть обходным путем для этого?

+0

Обеспечить пример данных, которые вы сортировочный. Вы уверены, что поля действительно пусты и что они не заполнены невидимыми символами типа «" или "\ t" или похожими? – jwpfox

+0

вы можете создать образец или jsfiddle, где мы можем воспроизвести ту же проблему .... –

+0

Привет, похоже, поскольку поля столбца представляют собой комбинацию пустых строк, нулей и ненулевых чисел, сортировка не работает должным образом. Как я могу сортировать по пустым полям сначала, а затем нулевые и другие числа в порядке возрастания и наоборот в порядке убывания? – nikitha

ответ

0

При условии, что ваш столбец только для чтения, вы можете добавить поле в источнике данных (см displayValue в коде ниже), отражающий ваши ценности, но где строки заменяются отрицательным числом.

Затем вместо реального поля помещайте только это поле в сетку. И отобразите реальное значение в функции get столбца.

Я использовал одно и то же обходное решение для применения сортировки без учета регистра в столбце, заполненном собственными именами.

require(["dgrid/Grid", "dojo/domReady!"], function (Grid) { 
 

 
\t var data = []; 
 

 
\t for(var i = 0; i < 3; i++) for(j = 1; j <= 2; j++) data.push({value: i}); 
 
\t for(i = 1; i < 3; i++) data.push({value: ""}); 
 

 
\t data.forEach(function(item) { 
 
\t \t item.displayValue = typeof item.value == "string" ? -1 : item.value; 
 
\t }); 
 

 
\t var grid = new Grid({ 
 
\t \t columns: { 
 
\t \t \t displayValue: { 
 
\t \t \t \t label: "Value", 
 
\t \t \t \t get: function(item) { return item.value; } 
 
\t \t \t } 
 
\t \t } 
 
\t }, 'grid'); 
 

 
\t grid.renderArray(data); 
 
\t grid.set("sort", "displayValue"); 
 
    
 
});
<script> 
 
    dojoConfig = { 
 
    async: true, 
 
    packages: [ 
 
     { 
 
     name: 'dgrid', 
 
     location: 'https://cdn.rawgit.com/SitePen/dgrid/v1.1.0' 
 
     } 
 
    ] 
 
    } 
 
</script> 
 
<script src="https://ajax.googleapis.com/ajax/libs/dojo/1.11.2/dojo/dojo.js"></script> 
 

 
<link rel="stylesheet" href="https://cdn.rawgit.com/SitePen/dgrid/v1.1.0/css/dgrid.css"/> 
 
    
 
<style> 
 
    .dgrid-row-table { 
 
     height: 24px; 
 
    } 
 
</style> 
 

 
<body> 
 
    <div id="grid" style="width:200px;height:210px"> 
 
    </div> 
 
</body>

+0

Решения выглядят хорошо, но обрабатывает ли он столбец комбинацию строк. Как он обрабатывает сравнение -1 с «foo». В этом случае нам нужна специальная функция сортировки? – nikitha

+0

В этом случае тест в forEach должен быть изменен на: 'item.displayValue = (! Item.value && typeof item.value ==" string ")? -1: item.value; '. Тем не менее, я пытался смешивать числа и строки в сетке (без моего обходного пути), и в любом случае сортировка не работает должным образом в этом случае: сначала сортировка в порядке возрастания => строки перед числами, следующий сортировка по возрастанию = > числа перед строками (!). AFAIK, мы не можем использовать специальную функцию сортировки с dgrid. Вот альтернатива: http://stackoverflow.com/questions/32197919/dgrid-custom-sort-issue. – Xodrow

+0

Я думал о пользовательском сортировке, потому что все столбцы, которые у меня есть в таблице, имеют смешанные типы. Существует столбец со строкой с номерами «g1», «g23», «g19», «», «g13». Но dgrid sort не работает желаемым образом. Как я могу справиться с этим оптимально, не создавая собственную функцию сортировки? На данный момент я попытался прослушивать событие «dgrid-sort» и установить собственную функцию сортировки (this.spreadsheetGrid.dgridTable.set («sort», function (obj1, obj2) {}); в зависимости от столбца, который я хотел бы Сортировка – nikitha

0

= Лучше ответ, как мой последний пост, после того, как ваши комментарии =

AFAIK, dgrid (а также dstore) не позволяет использовать пользовательскую функцию сортировки.

Образец ниже преодолевает это ограничение. Он использует OnDemandGrid, населенный dstore.

Например, столбец field1 этой сетки содержит значения от «g1» до «g20». Они не сортируются aphanumerically (сортировки по умолчанию), но численно (пользовательских сортировки на основе чисел после "г") => "g1" < "g2" < "g3" < ... < "G10" < "G11" ...

Этот обычай сортировка выполняется с помощью функции обратного вызова: comparegXX

var comparegXX = function(a, b) { 
    // 'compare' is a generic comparison function for values of the same type 
    try { 
    return compare(parseInt(a.value.substr(1), 10), parseInt(b.value.substr(1), 10)); 
    } 
    catch(ex) { return compareMixedTypes(a, b); } 
} 

... и comparegXX присваивается field1 в определении столбца (sort атрибута):

field1: { 
    sort: comparegXX 
}, 

Это то же самое для field2 (смешанные типы сортировки - строки и цифры - выполнено compareMixedTypes).

Если вы хотите назначить другой настраиваемый вид полю, напишите свою собственную функцию обратного вызова сравнения и добавьте ее в определение столбца поля: fieldX: {sort: myCompareFunction}.

Обратите внимание, что в хранилище не должно быть поля с именем _newPos. Это поле создается и используется функцией doSort. Он содержит новые относительные позиции строк данных после применения пользовательского сортировки - новый вид сетки основан на этом поле.

var compare = function(a, b) { return a > b ? 1 : a < b ? -1 : 0; } 
 

 
// comparison functions for custom sorts 
 
// use a.value and b.value in these functions, not directly a and b 
 

 
var comparegXX = function(a, b) { 
 
    try { 
 
    return compare(parseInt(a.value.substr(1), 10), parseInt(b.value.substr(1), 10)); 
 
    } 
 
    catch(ex) { return compareMixedTypes(a, b); } 
 
} 
 

 
var compareMixedTypes = function(a, b) { 
 
    var aType = typeof a.value; 
 
    return aType == typeof b.value ? compare(a.value, b.value) : 
 
    aType == "string" ? -1 : 1; 
 
} 
 

 
require(["dstore/Memory", "dgrid/OnDemandGrid", "dojo/domReady!"], function (Memory, OnDemandGrid) { 
 

 
    // populate the store (random values in field2) 
 

 
    var tbl = []; 
 
    for(var i = 1; i < 21; i++) { 
 
    var item = {id: i}; 
 
    item.field1 = "g" + i; 
 
    item.field2 = (i == 1 || Math.random() < 0.2) ? "" : Math.floor(Math.random() * 10); 
 
    tbl.push(item); 
 
    } 
 
\t 
 
    var store = new Memory({data: tbl }); 
 

 
    var grid = new OnDemandGrid({ 
 
    collection: store, 
 
    columns: 
 
    { 
 
     id: {}, 
 
     field1: { 
 
     sort: comparegXX 
 
     }, 
 
     field2: { 
 
     sort: compareMixedTypes 
 
     } 
 
    }, 
 
    }, 'grid'); 
 
\t 
 
    var lastField = null; 
 
    var descending = null; 
 

 
    grid.doSort = function(e) { 
 
    
 
    // custom sort of the grid, replaces the default sort 
 
    
 
    var field = e.sort[0].property; 
 

 
    if(lastField == field) descending = !descending; 
 
    else { 
 
     lastField = field; 
 
     if(descending == null) descending = e.sort[0].descending; 
 
    } 
 

 
    var sortFunc = grid.column(field).sort; 
 
\t \t 
 
    if(sortFunc) { 
 
     // calculate the positions of the rows based on the custom compare function, 
 
     // they are stored in the _newPos field, and then the grid is sorted on it 
 
     var tmp = [], tmp2 = {}; 
 
     store.forEach(function(item, i) { tmp.push({value: item[field], pos: i}); }); 
 
     tmp.sort(sortFunc); 
 
     tmp.forEach(function(item, i) { tmp2[item.pos] = i; }); 
 
     store.forEach(function(item, i) { item._newPos = tmp2[i]; }); 
 
     grid.set("sort", "_newPos", descending); 
 
    } 
 
    else grid.set("sort", field, descending); 
 
\t \t 
 
    grid.updateSortArrow([{property: field, descending: descending}]); 
 
\t \t 
 
    } 
 

 
    grid.on("dgrid-sort", function(e) { 
 
    grid.doSort(e); 
 
    e.preventDefault(); 
 
    }); 
 

 
    // initial sort of the grid, use this instead of grid.set("sort"...) 
 
    grid.doSort({sort: [{property: "field1", descending: false}]}); 
 

 
    grid.startup(); 
 
    
 
});
<script> 
 
dojoConfig = { 
 
    async: true, 
 
    packages: [ 
 
    { 
 
     name: 'dgrid', 
 
     location: 'https://cdn.rawgit.com/SitePen/dgrid/v1.1.0' 
 
    }, 
 
    { 
 
     name: 'dstore', 
 
     location: '//cdn.rawgit.com/SitePen/dstore/v1.1.1' 
 
    } 
 
    ] 
 
} 
 
</script> 
 
<script src="https://ajax.googleapis.com/ajax/libs/dojo/1.11.2/dojo/dojo.js"></script> 
 

 
<link rel="stylesheet" href="https://cdn.rawgit.com/SitePen/dgrid/v1.1.0/css/dgrid.css" /> 
 

 
<body> 
 
    <div id="grid" style="width:300px;height:530px;"> 
 
    </div> 
 
</body>