Несмотря на то, что уже существует принятый ответ, который наверняка решил начальный вопрос, я хотел указать на распространенную ошибку при обработке стека при обработке метода подписки Slickgrid.
Давайте представим, что наша сетка находится в переменной с именем 'grid', как и в большинстве других примеров.
Это происходит в большинстве принятых и / или проголосовавших ответов:
dataView.onRowsChanged.subscribe(function(e,args) {
grid.invalidateRows(args.rows);
grid.render();
});
или
grid.onSort.subscribe(function(e, args){
var cols = args.sortCols;
data.sort(function(dataRow1, dataRow2){
for (var i = 0, l = cols.length; i < l; i++){
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
}
return 0;
})
grid.invalidate()
grid.render()
})
Работают ли эти примеры как задумано? Да, они .. при определенных обстоятельствах.
Представим себе функцию, которая добавляет Slickgrid в список Slickgrids:
var m_grids = []
function anyName(){
var grid;
//..run code
//..run subscribe
m_grids.push(grid)
}
Так что же происходит сейчас, когда мы пытаемся вызвать любую функцию подписки, в то время как функция подписки содержит переменную grid? Он просто влияет на последнюю назначенную сетку, независимо от того, на какой подписке выполнена подписка.
Правильный способ подписать эти функции - параметр args:
dataView.onRowsChanged.subscribe(function(e,args) {
args.grid.invalidateRows(args.rows);
args.grid.render();
});
или
grid.onSort.subscribe(function(e, args){
var cols = args.sortCols;
args.grid.getData().sort(function(dataRow1, dataRow2){
for (var i = 0, l = cols.length; i < l; i++){
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
}
return 0;
})
args.grid.invalidate()
args.grid.render()
})
Это может быть второстепенный случай, поскольку обычно требуется более одной Slickgrid на одной странице, но зачем делать это неправильно, если мы могли бы исправить это очень легко:)