Javascript 在HandsOnTable上使用下拉功能(与AngularJS一起使用)时,更新表格单元格滞后

Javascript 在HandsOnTable上使用下拉功能(与AngularJS一起使用)时,更新表格单元格滞后,javascript,angularjs,handsontable,Javascript,Angularjs,Handsontable,关于: 我定义的handsOnTable中有一些列会根据其他列中的任何更改进行更新。如果更改只是普通编辑,则将立即更新要更改的列,但当我使用下拉功能更新其中一列时,应因此更改的列需要时间更新(滞后) 代码片段 $scope.handsOnTableSettings = { preventOverflow: 'horizontal', stretchH: 'all', minSpareRows: 0, dataSchema : {'x

关于: 我定义的handsOnTable中有一些列会根据其他列中的任何更改进行更新。如果更改只是普通编辑,则将立即更新要更改的列,但当我使用下拉功能更新其中一列时,应因此更改的列需要时间更新(滞后)

代码片段

$scope.handsOnTableSettings = {
        preventOverflow: 'horizontal',
        stretchH: 'all',
        minSpareRows: 0,
        dataSchema : {'x':'0', 'y':'0', 'z':'0.00', 'w':'000.00'},
        colHeaders: true,
        rowHeaders: false,
        copyPaste: true,
        afterInit: function () {
          handsOnInstance = this;
      },
        cells: function (row, col) {
          var cellProperties = {};
          var data = this.instance.getData();
          var keys = Object.keys($scope.stats)

          if (data[row] && (col == 11 || col == 10 || col == 9 || col == 7 || col == 6 || col == 5 || col == 4) && data[row][11] && $scope.stats && $scope.stats[keys[row]] && $scope.stats[keys[row]][5] && !$scope.current) 
            cellProperties.readOnly = true;
            return cellProperties;
          }
          return cellProperties;
        },
        afterChange: function (src, changes) {
          if(src!=null){
          src.forEach(function(src){
            if (changes !== 'loadData') {
              if (src[1] == 'x') {
                if(src[3] === ""){
                  handsOnInstance.setDataAtCell(src[0], 9, 0)
                }
                  handsOnInstance.setDataAtCell(src[0], 10, src[3] * handsOnInstance.getDataAtCell(src[0], 4) / 1000);
              }
              if (src[1] == 'y') {
                  handsOnInstance.setDataAtCell(src[0], 10, src[3] * handsOnInstance.getDataAtCell(src[0], 9) / 1000);
              }

              if (src[1] == 'z') {
                $scope.total = _.sum(handsOnInstance.getDataAtCol(10)).toFixed(2);
                  handsOnInstance.setDataAtCell(src[0], 9, src[3] * 1000 / handsOnInstance.getDataAtCell(src[0], 4));
                }

              }
            }
          })}
        }

掌上电脑版本

 "@bower_components/handsontable": "handsontable/handsontable#~0.31.2",

我不确定发生了什么,但我知道您应该注意在
afterChange
hook中使用
setDataAtCell
,因为
setDataAtCell
将触发hook,您可能会陷入循环。尝试通过检查更新单元格时使用此钩子的次数来进行调试。嘿@KBell我不会因为指定的条件而陷入循环中。只是当我使用dragdown更新多个单元格时,setDataAtCell函数调用在AfterChange函数完成后执行。setDataAtCell是否异步??因为它可能会移动到回调队列,一旦调用堆栈为空,所有setDataAtCell都会很好地执行。我不知道它是否是异步的,但我想不是。虽然一次设置多个单元格的推荐方法是一次仅使用
setDataAtCell
一组更改,而不是每个值(请参阅)。此外,您能否提供一个简单的fiddle或stackblitz来解决您提到的问题?这将更容易理解并尝试解决您的问题。;)