如何在 Handsontable 的 afterChange 中使用 getCellMeta?

Posted

技术标签:

【中文标题】如何在 Handsontable 的 afterChange 中使用 getCellMeta?【英文标题】:How to use getCellMeta in afterChange at Handsontable? 【发布时间】:2018-06-06 12:50:37 【问题描述】:

我正在使用 handsontable js 插件。我想在 afterChange 钩子中使用 getCellMeta 函数但不起作用。 我在使用 afterChange 钩子函数时,函数正在工作。但在 afterChange 挂钩中不起作用。

var container = document.getElementById('t1'),
  options = document.querySelectorAll('.options input'),
  table,
  hot; 

hot = new Handsontable(container,     
  autoWrapRow: true,
  startRows: 81,
  startCols: 206,
  autoColumnSize : true,  
  stretchH: 'all', 
  afterChange : function(change,source)  
      if (source === 'loadData') 
        return;
         
      var test = this.getCellMeta(change[0],change[1]); // not working, not return "id" meta
      console.log(test);  
  
);

$.ajax(
  url: 'path',
  type: 'GET',
  dataType: 'json',
  success: function (res)  
    var data = [], row, pc = 0; 
    for (var i = 0, ilen =  hot.countRows(); i < ilen; i++)
    
      row = []; 
      for (var ii = 0; ii<hot.countCols(); ii++)
         
        hot.setCellMeta(i,ii,'id',res[pc].id);
        row[ii] =   res[pc].price;
        if(pc < (res.length-1)) 

        pc++;
        
       
      data[i] = row;
      
    hot.loadData(data);
  
); 

var test = this.getCellMeta(0,0); // is working, return "id" meta
console.log(test);  

输出控制台日志我在更改后尝试过;

在afterChange中输出控制台日志使用;

更改后如何获取单元格元数据?

谢谢。

【问题讨论】:

我不熟悉这个插件,但是文档只显示了 beforeGetCellMeta 和 afterGetCellMeta ; getCellMeta 是从哪里来的? link@kshikama 【参考方案1】:

你快到了,只是你的回调中有一个小错误:doc for afterChange 指定回调的第一个参数 (changes) 是:

包含每个已编辑单元格信息的二维数组 [[row, prop, oldVal, newVal], ...].

所以,两个重要的细节:

要获取受影响单元格的行/列的“元”(假设只有一个),您需要调用 hot.getCellMeta(change[0][0],change[0][1]) 例如 在hot 而不是this 因为afterChange 回调函数是从不同的上下文(即在不同的对象上)调用的,所以this 不是调用的正确目标,请参阅How does the "this" keyword work?

读取整个更改数组的示例:

var hot = new Handsontable(container, 
  /* rest of init... */
  afterChange : function(changes,source) 
      console.log("Changes:", changes, source);
      if (changes) 
          changes.forEach(function(change) 
              var test = hot.getCellMeta(change[0],change[1]);
              console.log(test.id, test); // 'id' is the property you've added earlier with setMeta         
          );
      
  
);

查看demo fiddle,打开 JS 控制台,在表格中进行任何更改。

【讨论】:

另外,由于上下文变化,不能真正调用this.getCellMeta(change[0][0],change[0][1])。需要按名称引用 hansontable 对象:hot.getCellMeta(change[0],change[1]); 啊,是的,这就是我在完整示例中所做的,但我在单行中留下了this。将编辑,谢谢。 也许,在你的答案中也添加一个关于上下文变化的注释,因为这是每个人都知道的事情:人们认为他们的 Handsontable(...) 定义中的 this 指的是可操作的对象,但它不会,因为 Handsontable 会为您切换 afterChange 调用的上下文。 现在好点了吗?我不打算过多地修饰这个答案,因为它只是解决一个简单的错误(是的,this 的一个已知问题已经有了答案,所以我链接到它)。随意编辑:)

以上是关于如何在 Handsontable 的 afterChange 中使用 getCellMeta?的主要内容,如果未能解决你的问题,请参考以下文章

如何在handsontable的单元格内添加自定义按钮?

如何禁用在handsontable中添加新行/列?

Handsontable:如何在渲染函数中更改单元格值

Handsontable - afterChangeEvent 如何检测何时删除或添加整行

如何在 Handsontable 中使用自定义渲染器对列进行排序?

如何在 Handsontable 中创建跨越两列的行标题?