patternjavascriptMinor
JQGrid with dynamic columns and server-side functionality
Viewed 0 times
columnsserverwithsidejqgriddynamicandfunctionality
Problem
I have a requirement where I need to build a grid with dynamic columns. I am dealing with a large dataset so I would like to use server-side paging, sorting, filtering logic so that I render only a page-size. I think I got the basic functionality working but just wanted to get my approach reviewed.
An action route will be the JSON datasource for the
Reference
My approach:
I am using a flag in the query string to determine if I need the col model (or) the data.
Note: I set the async flag to false for the AJAX requests to make sure I do not run into timing issues.
As you can see, I need to make two requests to set up the grid. One to get the col model and another one to get data and to update it to enable server-side interaction for subsequent requests. Is this ok?
```
$.ajax({
url: firstFetchURL, //will hit an asp.net mvc action on a controller that returns json
dataType: "json",
type: 'POST',
async: false,
success: function (result) {
if (result) {
if (!result.Error) {
var colD = result.data;
var colM = result.colModelList;
var colN = result.columnNames;
$("#myGrid").jqGrid('GridUnload');
$("#myGrid").jqGrid({ datatype: 'local',
colModel: colM,
colNames: colN,
data: colD,
height: "auto",
rowNum: 10,
sortname: viewOptionText,
sortorder: "desc",
pager: '#myGridPager',
caption: "Side-by-Side View",
viewrecords: true,
gridview: true
});
//Update grid params so that subsequent
An action route will be the JSON datasource for the
jqgrid.Reference
My approach:
- First make an ajax call to get the dynamic col model and other grid params (
rows,pageetc.) except data.
- Update grid params (
url,datatypeandmtype) to enable server-side paging, sorting etc.
I am using a flag in the query string to determine if I need the col model (or) the data.
Note: I set the async flag to false for the AJAX requests to make sure I do not run into timing issues.
As you can see, I need to make two requests to set up the grid. One to get the col model and another one to get data and to update it to enable server-side interaction for subsequent requests. Is this ok?
```
$.ajax({
url: firstFetchURL, //will hit an asp.net mvc action on a controller that returns json
dataType: "json",
type: 'POST',
async: false,
success: function (result) {
if (result) {
if (!result.Error) {
var colD = result.data;
var colM = result.colModelList;
var colN = result.columnNames;
$("#myGrid").jqGrid('GridUnload');
$("#myGrid").jqGrid({ datatype: 'local',
colModel: colM,
colNames: colN,
data: colD,
height: "auto",
rowNum: 10,
sortname: viewOptionText,
sortorder: "desc",
pager: '#myGridPager',
caption: "Side-by-Side View",
viewrecords: true,
gridview: true
});
//Update grid params so that subsequent
Solution
Small recommendations:
UPDATED: Look at this and this answers. Probably the approach is what you need from the dynamic columns.
You can take a look in the answer in case if you will need to use custom formatters.
- It seems to me that you can remove
async: falseparameter for the$.ajaxcall.
- You can remove
result.datafrom the data returned by the ajax call. (After that you should and the line withvar colD = result.data). The data will be not really used because you calltrigger('reloadGrid');immediately.
- On the other side the values for
sortnameandsortorderparameters should be included in the data model (as the properties ofresult).
- You can use
url: secondFetchURL, datatype: 'json', mtype: 'POST'parameters directly in the jqGrid definition ( in$("#myGrid").jqGrid({/here/});. Notrigger('reloadGrid')will be needed.
UPDATED: Look at this and this answers. Probably the approach is what you need from the dynamic columns.
You can take a look in the answer in case if you will need to use custom formatters.
Context
StackExchange Code Review Q#3668, answer score: 5
Revisions (0)
No revisions yet.