如何在Aurelia SlickGrid结合OData时使用gt/le自定义过滤操作符
Aurelia SlickGrid OData请求自定义操作符配置
问题场景
需要在发起OData请求时使用自定义gt/le操作符,替换Aurelia SlickGrid内置默认拼接的eq操作符。
当前使用的列定义配置如下:
{ id: 'LockoutEndDateUtc', name: 'Status', field: 'LockoutEndDateUtc', minWidth: 85, maxWidth: 95, type: FieldType.boolean, sortable: true, formatter: Formatters.multiple, params: { formatters: [this.StatusFormatter, Formatters.checkmark] }, filterable: true, filter: { collection: [ { value: 'le ' + (() => {const dt = new Date(); return dt.toISOString().split('.')[0] + "Z";})(), label: 'True' }, { value: 'gt ' + (() => {const dt = new Date(); return dt.toISOString().split('.')[0] + "Z";})(), label: 'False' } ], model: Filters.singleSelect, } }
当前界面效果:
框架自动生成的错误$filter请求参数格式:
$filter=(LockoutEndDateUtc%20eq%20le%202022-06-28T12%3A59%3A25Z)
验证结果:移除参数中自动拼接的
%20eq(URL解码后为eq)后,请求可正常运行。需要实现框架不自动追加eq,直接传递自定义的gt/le操作符。
解决方法
方法1:为下拉选项单独指定操作符(推荐)
不要将操作符拼接在选项的value字段中,改为给每个下拉选项单独配置operator属性,框架识别到选项自带操作符时,会优先使用该配置,不会追加默认的eq。
修改后的filter配置如下:
filter: { collection: [ { value: (() => { const dt = new Date(); return dt.toISOString().split('.')[0] + "Z"; })(), label: 'True', operator: 'le' // 指定该选项使用le操作符 }, { value: (() => { const dt = new Date(); return dt.toISOString().split('.')[0] + "Z"; })(), label: 'False', operator: 'gt' // 指定该选项使用gt操作符 } ], model: Filters.singleSelect, }
方法2:自定义过滤参数序列化逻辑
如果使用的框架版本不支持选项级operator配置,可以在网格配置的OData后端服务参数中,自定义过滤条件的序列化逻辑,手动跳过默认的eq拼接:
// gridOptions 配置项 backendServiceConfig: { service: new OdataService(), // 自定义过滤条件拼接规则 filterSerializer: (filterOptions) => { return filterOptions.filters.map(item => { // 针对LockoutEndDateUtc字段,直接使用拼接了操作符的搜索值,不追加默认eq if (item.field === 'LockoutEndDateUtc') { return `${item.field} ${item.searchTerm}`; } // 其余字段走默认拼接规则 return `${item.field} ${item.operator || 'eq'} ${item.searchTerm}`; }).join(' and '); } }
内容的提问来源于stack exchange,提问作者sb32134
相关产品推荐
相关产品推荐

