JqGrid设置列默认搜索操作符问题:刷新后筛选重置
问题
能否为单个列设置默认搜索操作符?我有一个名为Severity的列,默认值为4,希望默认显示“le”(<=)操作符,筛选小于等于该值的数据。
目前的代码里,我通过postData设置了初始筛选规则,也手动修改过搜索工具栏的操作符,但点击刷新按钮后,Severity列的操作符会被重置为“eq”,要么想办法强制这个列始终用“le”,要么修复刷新按钮让它保留正确的操作符。
我的代码片段:
jQuery(document).ready(function() { jQuery('#grid').jqGrid({ url:'logging.ajax', datatype: 'json', colModel:[ {name:'Code', index:'Code', width:100, sorttype:'int', searchoptions:{sopt:['eq','cn','ne','nc','lt','le','gt','ge','bw','bn','in','ni','ew','en']}}, {name:'Severity', index:'Severity', width:100, sorttype:'int', searchoptions:{defaultValue: 4, sopt:['eq','cn','ne','nc','lt','le','gt','ge','bw','bn','in','ni','ew','en']}}, {name:'Log', index:'Log', align: 'left', width:200, searchoptions:{sopt:['eq','cn','ne','nc','bw','bn','in','ni','ew','en']}}, {name:'ID', index:'ID', width: 100, sorttype:'int', key: true, searchoptions:{sopt:['eq','cn','ne','nc','lt','le','gt','ge','bw','bn','in','ni','ew','en']}} ], rowNum: 500, rowList: [100,200,500,1000], styleUI : 'Bootstrap', gridview: true, pager: '#gridpagernav', sortname: 'ID', loadonce: false, viewrecords: true, cellEdit: false, sortorder: 'desc', multiSort: true, ExpandColClick: true, forceFit: true, editurl:'logging.ajax', autowidth: true, shrinkToFit: false, height: Math.max(200, $(window).height()-400) }).navGrid('#gridpagernav', { edit: false, add: false, del: false, refresh: true, search: true, recreateForm: true }, //options {}, // edit options {}, // add options {}, // del options { closeAfterSearch: true, multipleSearch: true, multipleGroup: true, showQuery: false, } // search options ).filterToolbar({stringResult: true, searchOnEnter: false, defaultSearch: 'cn', ignoreCase: true, searchOperators: true}); });
我试过手动修改操作符:
$('.soptclass[colname=\"Severity\"]').attr('soper', 'le') $('.soptclass[colname=\"Severity\"]').html('<=') $('.soptclass[colname=\"Log\"]').attr('soper', 'cn') $('.soptclass[colname=\"Log\"]').html('~')
也加过初始筛选:
postData: { filters:JSON.stringify({'rules': [{'field':'Severity', 'op':'le', 'data':'4'}]}) },
但刷新后还是会重置成eq。
解决办法
1. 直接在列配置里指定默认操作符
修改Severity列的searchoptions,加上defaultSearch: 'le',这样该列默认就用le操作符,配合已有的defaultValue:4,初始化和刷新后都会保持这个设置。
修改后的colModel中Severity项:
{name:'Severity', index:'Severity', width:100, sorttype:'int', searchoptions:{defaultValue: 4, defaultSearch: 'le', sopt:['eq','cn','ne','nc','lt','le','gt','ge','bw','bn','in','ni','ew','en']}},
2. 监听刷新事件重置操作符和筛选规则
给grid绑定jqGridRefresh事件,刷新后重新设置Severity的操作符和筛选条件,避免被重置:
// 放在jqGrid初始化代码后面 $("#grid").on("jqGridRefresh", function() { // 重置操作符显示 $('.soptclass[colname="Severity"]').attr('soper', 'le').html('<='); // 重新设置筛选规则 var postData = $(this).jqGrid('getGridParam', 'postData'); postData.filters = JSON.stringify({'rules': [{'field':'Severity', 'op':'le', 'data':'4'}]}); $(this).jqGrid('setGridParam', {postData: postData}).trigger('reloadGrid'); });
3. 自定义刷新按钮的行为
替换默认的刷新按钮逻辑,确保刷新时保留当前的筛选条件(包括Severity的le操作符):
在navGrid的配置里添加refreshfunc:
.navGrid('#gridpagernav', { edit: false, add: false, del: false, refresh: true, search: true, recreateForm: true, // 自定义刷新逻辑 refreshfunc: function() { // 获取当前筛选条件,没有的话设置默认规则 var currentFilters = $("#grid").jqGrid('getGridParam', 'postData').filters; if (!currentFilters) { currentFilters = JSON.stringify({'rules': [{'field':'Severity', 'op':'le', 'data':'4'}]}); } // 重新加载表格,带上筛选条件 $("#grid").jqGrid('setGridParam', { datatype: 'json', postData: {filters: currentFilters} }).trigger('reloadGrid'); // 重置操作符显示 $('.soptclass[colname="Severity"]').attr('soper', 'le').html('<='); } }, {}, {}, {}, { closeAfterSearch: true, multipleSearch: true, multipleGroup: true, showQuery: false, } )
4. 强制搜索时使用le操作符
在filterToolbar的beforeSearch事件里,检查并修改Severity列的操作符,确保每次搜索都用le:
.filterToolbar({ stringResult: true, searchOnEnter: false, defaultSearch: 'cn', ignoreCase: true, searchOperators: true, beforeSearch: function() { var postData = $(this).jqGrid('getGridParam', 'postData'); if (postData.filters) { var filters = JSON.parse(postData.filters); // 遍历规则,找到Severity列并强制op为le for (var i = 0; i < filters.rules.length; i++) { if (filters.rules[i].field === 'Severity') { filters.rules[i].op = 'le'; break; } } postData.filters = JSON.stringify(filters); $(this).jqGrid('setGridParam', {postData: postData}); } return true; } });
内容的提问来源于stack exchange,提问作者user21098501
相关产品推荐
相关产品推荐

