最近因为接手一个旧项目使用了easyUI框架,发现一个关于datagrid filter里id筛选的问题,当输入的id过长时,值会自动变成其他值。因为对easyUI不是很熟,通过源码发现其中一个处理筛选值的函数使用了parseFloat([filter value])
导致超过16位的值精度丢失,如搜索200000005214716794会变成200000005214716800,以下是调用datagird-filter的api实现筛选部分的代码:
$('#table').datagrid('enableFilter', [{
field: 'id',
hasFilter: true,
type: 'numberbox', // 注意:只有当类型为numberbox时才会出现精度丢失问题
options: {
onChange(value) {
console.log(value) // 此时value已经变为精度丢失后的值
...
}
}
}])
**解决思路:**找到原因后开始想解决办法,肯定是不建议修改easyUI的源代码,咨询同学提供了一个思路,将type值改为'textbox',但需要手动添加监听id input框的change事件来实现回调后的逻辑,通过熟悉easyUI的api找到了以下方法:
$('#table').datagrid('enableFilter', [{
field: 'id',
hasFilter: true,
// 注意:将类型改为文本避免精度问题,但textbox类型不会触发options的onChange事件
// 如果需要onChange回调需要使用下面的textbox事件
type: 'textbox'
}])
// 获取filter组件中id筛选的DOM
var idFilterCompt = $('#table').datagrid('getFilterComponent', 'id');
// 通过textbox的onChange事件添加回调逻辑
idFilterCompt.textbox({
onChange(value) {
...
}
})
也算是搞了挺长时间的,主要是对easyUI不太熟,以上方法就可以在不改easyUI源码的基础上,解决数字筛选的精度问题了。