agGrid不允许对指定行做checkbox选择

在agGrid中,官方文档提供了控制行选择的方法,但遇到一个bug:设置行不可选择时,全选和反选功能受到影响。解决办法包括不渲染不可选行的checkbox,并通过API获取选中行,过滤掉不可选行,同时处理颜色和全选的逻辑,以达到视觉上未选中的效果。滚动时可能出现颜色恢复,需在滚动事件中再次执行处理逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

官方文档如下描述:

https://www.ag-grid.com/javascript-grid-selection/#specify-selectable-rows

界面:

方法一:(只控制点击checkbox时不能选择,但是出了一个bug,如有遇到的伙伴望能够交流一下解决方案。 设置某些行不可进行行选择时,这个方法对全选框也起了作用,导致1、全选时全选checkbox没有选中图标,2、反选也就是取消所有选择失效)

 

解决办法:2019-3-25补充:自己写判断有太多情况需要判断,而且不好找判断条件,所以最后解决步骤:(换了一个方法解决)

1、 不可选的行不渲染checkbox,这里说明:即使没有渲染checkbox框,其实该行仍然可以被选中(比如选中后的颜色会被加上)用的方法是:

checkboxSelection:(params)=>{
    let field=params.data;
    this.actions.getNotSelectAndRowId(params);//获取不可选行的索引和id
    return params.data?!options.includes(field.f8)&&!options.includes(field.f11):false;
}

// 获取冲突行的_id和rowid
getNotSelectAndRowId:function(params){
    let options=['是','是(请假)'];
    let field=params.data;
    let id = field._id;
    //获取所有冲突行的_id /行ID  options.includes(field.f7)||
    if (options.includes(field.f8)||options.includes(field.f11)) {
        !this.data.notSelectData.includes(id)&& this.data.notSelectData.push(id)
        if (params.node) !this.data.notSelectRowId.includes(params.node.id)&&this.data.notSelectRowId.push(params.node.id)
        else if (params.id) !this.data.notSelectRowId.includes(params.id)&&this.data.notSelectRowId.push(params.id)
    }
},

2、从api里获取所有选中的行,然后根据条件筛选不可选的,把这些行存起来,行索引和每行的唯一识别的比如id(有时候id可能是索引,要区别开)方法:api.getSelectedRows()

let rows = this.agGrid.gridOptions.api.getSelectedRows();
//去掉rows中冲突的行数据
if ((this.data.viewMode== "viewFromCorrespondence"||this.data.viewMode=='editFromCorrespondence') &&this.data.parentTableId== "8174_vZhJu4jY8yfZpVTjkmsrhF") {
    for (let r = 0; r < rows.length; r++) {
        for (let j = 0; j < this.data.notSelectData.length; j++) {
            if (rows[r]&&rows[r]._id == this.data.notSelectData[j]) {
                rows.splice(r, 1)
            }
        }
    }
    this.actions.removeNotSelectDataColor()
}

3、

第一个:判断单行点击,单击某个单元格多次可能会选中改行

第二个:点击全选,其实点击全选还是选中的全部数据,这时候通过之前拿到的每行的id的数组,把不可选的行从getSelectedRows()这去除掉,这样保存下来的数据里就不会存在不可选的行数据

此外,因为全选会给所有行加上选中的颜色,这里需要通过行索引的数组把颜色去掉

//移除冲突行的选中颜色
  removeNotSelectDataColor:function(){
console.log('this.data.isSaveSelectData',localStorage.getItem('isSaveSelectData'),localStorage.getItem('isSaveSelectData')=='false',typeof localStorage.getItem('isSaveSelectData'))
      //如果刚刚保存的排期单对应关系数据,就返回不取消颜色
      if (localStorage.getItem('isSaveSelectData')!='false'){
          return;
      }
      for(let i=0;i<$('.ag-row').length;i++){
          let rowId = $('.ag-row')[i].getAttribute('row');
          //let className = $('.ag-row')[i].className;
          if (this.data.notSelectRowId.includes(rowId)){
              $($('.ag-row')[i]).removeClass('ag-row-selected')
          }
      }
  },

总结:这个方法其实就是障眼法,页面看着没选中,其实是选中状态的,只是人为的把选中颜色取消了,把checkbox取消了,把不可选的行数据直接从所有数据里删掉了,这样保存和全选反选就没问题了

 

遇到一个bug:滚动可能之前没有颜色的不可选的行颜色会被再次加上,这个把去掉颜色 的方法在滚动事件里在执行一次就ok

this.el.find('.ag-body-viewport').on('scroll', _.debounce((e) => {
    That.actions.setFloatingFilterInput();
    //解决agGrid滚动冲突行颜色问题
    this.actions.removeNotSelectDataColor();
}, 700));

其他问题针对不同的情况而定,愿大家写代码写的开心

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值