下面我复制了我的jqGrid并修剪了很多不相关的属性等等,但是下面的基本代码足以封装我的问题。
我有一个动态过滤器,在成功返回ajax调用后填充。返回的json保存下拉列表的字符串值(uniqueRunDates)以及其他值。使用'setColProp'将字符串(uniqueRunDates)动态添加到列中。完成jgGrid后,函数中的下一行代码将调用网格的重新加载,新的过滤器就位。
过滤器效果很好,就像静态(如'JobStatus')过滤器有一个例外。搜索。
网格有三个搜索(文本框和两个下拉列表[一个是uniqueRunDates]),可以互换使用。当用户在文本框中键入内容时,网格正确更新,返回json具有新的唯一日期,我通过'setColProp'添加它们。最后一块是必须调用'reloadGrid'。问题是我该怎么做???
首先,执行网格创建后的代码。执行搜索时,只执行此jgGrid代码。我当然不能把'reloadGrid'放在成功调用中,因为这会产生一个循环。我试图使用工具栏的'afterSearch'属性,但是当我需要时它似乎没有被触发。
我是否以正确的方式解决这个问题?有没有更简单的方法来处理这个看似常见的概念?动态搜索过滤器?非常感谢您提供的任何帮助和/或指导。
$("#gridTable").jqGrid({
async: false,
datatype: function (jqGridModel) {
$.ajax({
async: false,
url: 'Application.aspx/getJqGridData',
data: JSON.stringify({ 'rptPath': rptPath, 'jqGridModel': jqGridModel, 'userId': userId }),
success: function (data, textStatus, jqXHR) {
populateGrid(data);
var uniqueRunDates = (JSON.parse(data)).uniqueDates;
$("#gridTable").jqGrid('setColProp', 'Run_Date', {
stype: 'select',
searchoptions: { value: uniqueRunDates, sopt: ['dateEq'] }
});
}
});
},
colNames: ['', 'Report Name', 'Run Status', 'Run Date', 'Expiring On', 'Category', 'Actions'],
colModel: [
{ name: 'Run_Date', index: 'RunDate', align: 'center', title: false, sortable: true, width: 40 }
{ name: 'Report_Name', index: 'ReportNameDisplay', align: 'left', title: false, sortable: true, formatter: reportLinkFormatter },
{ name: 'Run_Status', index: 'JobStatus', align: 'left', title: false, sortable: true, width: 50,
stype: 'select',
searchoptions: { value: ':All Status;Completed:Completed;Failed:Failed;Pending:Pending;No Data Returned:No Data Returned;:Returned' }
},
],
pager: jQuery('#gridPager'),
rowNum: 15,
rowList: [15, 25, 35, 50],
sortname: 'RunDate',
sortorder: "desc",
height: '100%',
multiselect: true
}
});
//Refresh necessary for the dynamically added 'run date' filter.
$("#gridTable").trigger("reloadGrid");
$('#gridTable').jqGrid('filterToolbar', {
stringResult: true
});
。 。 。 。
更新 我已更新网格以遵循以下建议。
我能够查询服务器,并返回JSON对象的字符串版本。我也能够在'beforeProcessing'方法中看到返回值,看起来不错。然而,网格不再填充。我不确定我的返回格式是否正确设置了jsonReader。 data.d = {“total”:2,“page”:1,“records”:25,“rows”:[{“id”:“23”,“cell”:[“0”,“xxx”, “XXX”,...]} ...
我认为这种类型没有排队......想法?
$("#gridTable").jqGrid({
async: false,
url: 'Application.aspx/getJqGridData',
ajaxGridOptions: { contentType: "application/json" },
serializeGridData: function (postData) {
if (postData.filters == undefined) postData.filters = null;
postData.jqGridModel = { page: postData.page, _search: postData._search, rows: postData.rows,
sidx: postData.sidx, sord: postData.sord, filters: postData.filters
};
postData.rptPath = rptPath;
postData.userId = userId;
return JSON.stringify(postData);
},
contentType: 'application/json; charset=utf-8',
datatype: "json",
mtype: 'POST',
beforeProcessing: function (data) {
},
colNames: ['', 'Report Name', 'Run Status', 'Run Date', 'Expiring On', 'Category', 'Actions'],
colModel: [
{ name: 'Is_Fav', index: 'Favorites', align: 'center', title: false, sortable: false, search: false, width: 5, formatter: favImageFormatter },
{ name: 'Report_Name', index: 'ReportNameDisplay', align: 'left', title: false, sortable: true, formatter: reportLinkFormatter },
{ name: 'Run_Status', index: 'JobStatus', align: 'left', title: false, sortable: true, width: 50,
stype: 'select',
searchoptions: { value: ':All Status;Completed:Completed;Failed:Failed;Pending:Pending;No Data Returned:No Data Returned;:Returned' }
},
{ name: 'Run_Date', index: 'RunDate', align: 'center', title: false, sortable: true, width: 40,
selectOptions: {
dataUrl: 'Application.aspx/getJqGridData',
buildSelect: function (data) {
var gData;
if (data.hasOwnProperty('d')) gData = data.d;
else gData = data;
var uniqueRunDates = (JSON.parse(gData)).uniqueDates;
var html = '<select>', length = gData.length, i = 0, item;
for (; i < length; i++) {
item = d[i];
html += '<option value=' + item + '>' + item + '</option>';
}
html += '</select>';
return html
}
}
},
{ name: 'Expiring_On', index: 'ExpirationDate', align: 'center', title: false, sortable: true, width: 40, search: false },
{ name: 'Category', index: 'Category', align: 'left', title: false, sortable: true, width: 80 },
{ name: 'Actions', index: '', align: 'left', title: false, sortable: false, width: 25, search: false, formatter: actionsFormatter }
],
pager: jQuery('#gridPager'),
rowNum: 15,
rowList: [15, 25, 35, 50],
sortname: 'RunDate',
sortorder: "desc",
height: '100%',
viewrecords: true,
sortable: true,
jsonReader: {
root: "d.rows",
page: "d.page",
total: "d.total",
records: "d.records"
},
forceFit: true,
multiselect: true,
loadError: function (jqXHR, textStatus, errorThrown) {
alert(jqXHR.responseText);
},
gridComplete: function () {
doGridComplete(rptPath);
},
beforeSelectRow: function (rowid, event) {
// Only allow row selection if the chekbox in the row is clicked
var index = $.jgrid.getCellIndex(event.target);
if (index == 0) {
return true;
}
return false;
},
subGrid: true,
subGridRowExpanded: function (subgrid_id, row_id) {
getReportDetails(subgrid_id, row_id, rptPath);
}
});
$('#gridTable').jqGrid('filterToolbar', {
stringResult: true
});
答案 0 :(得分:2)
我不确定,我理解你需要什么。
您可以使用value
属性而不是设置searchoptions
dataUrl
属性,这使得Ajax请求可以填充选择选项。 Here和here您可以找到一些代码示例,这些示例可以帮助您实现dataUrl
。
此外,您应该从不使用datatype
作为函数,只是为了自己进行jQuery.ajax
调用。 jqGrid有很多选项,例如ajaxGridOptions
,jsonReader
选项,serializeRowData
回调等等。我建议您阅读the answer和this one,其中包含您可以下载和测试的圆顶项目。
如果你使用标准的jqGrid机制,你仍然需要对网格上的数据进行一些修改(比如设置一些jqGrid选项),你可以使用beforeProcessing
回调。回调beforeProcessing
允许在 jqGrid处理从服务器返回的数据之前在colModel
或任何jqGrid选项中进行更改。