SlickGrid: prosty przykład użycia DataView zamiast surowych danych?
Pracuję z SlickGrid, wiążąc dane bezpośrednio do siatki z połączenia Ajax. To działa dobrze w tej chwili, siatka aktualizuje się dynamicznie i jest sortowalny, a ja używam niestandardowego formatera dla jednej kolumny:
var grid;
var columns = [{
id: "time",
name: "Date",
field: "time"
},
{
id: "rating",
name: "Rating",
formatter: starFormatter // custom formatter
}
];
var options = {
enableColumnReorder: false,
multiColumnSort: true
};
// When user clicks button, fetch data via Ajax, and bind it to the grid.
$('#mybutton').click(function() {
$.getJSON(my_url, function(data) {
grid = new Slick.Grid("#myGrid", data, columns, options);
});
});
Jednak chcę zastosować klasę do wierszy w siatce na podstawie wartości danych, więc wygląda na to, że muszę użyć DataView zamiast. Przykład DataView na SlickGrid wiki jest dość skomplikowany i posiada wiele dodatkowych metod.
Proszę, czy ktoś może wyjaśnić, jak po prostu przekonwertować data
do DataView
- zarówno początkowo, jak i na AJAX reload - pozostawiając sortowanie siatki, i nadal używać mojego niestandardowego formatera? (Nie muszę wiedzieć, jak zastosować klasę, dosłownie tylko jak używać DataView.)
3 answers
Kluczowe elementy to zainicjowanie siatki za pomocą dataview jako źródła danych, połączenie zdarzeń tak, aby siatka reagowała na zmiany w dataview i ostatecznie przekazywała dane do dataview. Powinno to wyglądać mniej więcej tak:
dataView = new Slick.Data.DataView();
grid = new Slick.Grid("#myGrid", dataView, columns, options);
// wire up model events to drive the grid
dataView.onRowCountChanged.subscribe(function (e, args) {
grid.updateRowCount();
grid.render();
});
dataView.onRowsChanged.subscribe(function (e, args) {
grid.invalidateRows(args.rows);
grid.render();
});
// When user clicks button, fetch data via Ajax, and bind it to the dataview.
$('#mybutton').click(function() {
$.getJSON(my_url, function(data) {
dataView.beginUpdate();
dataView.setItems(data);
dataView.endUpdate();
});
});
Zauważ, że nie musisz tworzyć nowej siatki za każdym razem, wystarczy powiązać dane z dataview.
Jeśli chcesz zaimplementować sortowanie, musisz również powiedzieć dataview, aby sortowała, gdy siatka otrzyma Zdarzenie sortowania:
grid.onSort.subscribe(function (e, args) {
sortcol = args.sortCol.field; // Maybe args.sortcol.field ???
dataView.sort(comparer, args.sortAsc);
});
function comparer(a, b) {
var x = a[sortcol], y = b[sortcol];
return (x == y ? 0 : (x > y ? 1 : -1));
}
(Ten podstawowy sortowanie jest pobierane z przykładów SlickGrid, ale możesz chcieć zaimplementować coś domowego; na przykład bez użycia zmiennej globalnej)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-23 14:52:30
Poniższe dobrze wyjaśnia dataView: https://github.com/mleibman/SlickGrid/wiki/DataView
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-24 22:09:37
MultiColumnSort: true = = > sortCol Typ: Tablice.
multiColumnSort: false = = > sortCol type: Object.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-11 07:31:47