关于easyUI datagrid filter精度丢失的问题

310 阅读1分钟

最近因为接手一个旧项目使用了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源码的基础上,解决数字筛选的精度问题了。