关于更新对单元格的注释的动手性能问题

时间:2017-08-01 06:42:12

标签: javascript handsontable

我有一个函数可以将注释更新到一行中的每个单元格。此函数由更高级别的函数多次调用,该函数循环遍历表中的每一行并确定要应用的注释。

一切正常。请参阅下面代码的简化版本。

// Loop through all hot rows and determine comment to apply
var loopThroughHotRows = function (hot) {
   var rows = hot.getSourceData().length;
   for (var i = 0; i < rows; i++) {
       var comment = "some comment determined by another function";
       applyResponseCommentsToRow(hot, comment, i);
   }
}

// Apply comments to a whole row in a passed handsontable
var applyCommentsToRow = function (hot, comment, logicalrow) {
  var cols = hot.countCols();
  var commentsPlugin = hot.getPlugin('comments');
  for (var i = 0; i < cols; i++) {
    // render being issued for each comment set.
    // need to restrict rendering somehow.
    commentsPlugin.setCommentAtCell(logicalrow, i, comment);
  }
}

问题在于每次评论都应用于单元格。启动整个手动实例的渲染。导致Web浏览器被阻塞/突变/变得非常缓慢且响应迅速,直到所有渲染完成。

所以我的问题是。是否有某种方法可以防止每次将新注释应用于单元格时呈现Handsontable?通过暂时禁用所有渲染或以不同方式添加注释?

2 个答案:

答案 0 :(得分:1)

我能想到的第一件事就是提高功能的速度是 在没有必要时更改单元格中的注释。 (旧评论值=新评论值)。要做到这一点,您只需在执行setCommentAtCell之前比较两个String:

if(comment.localeCompare(hot.getPlugin('comments').getCommentAtCell(logicalRow,i)) != 0)
    commentsPlugin.setCommentAtCell(logicalRow, i, comment);

我使用了一个小例子来快速测试您在此JSFiddle中可以找到的此更改。 (为了'快速测试',当我复制时,我触发每个单元格的更改注释:是否在表格中使用ctrl + C,或者您使用复制在上下文菜单中。)

您将看到它将在第一次冻结(因为每个单元格都将被修改),但第二次没有冻结,因为没有必要进行更改。

答案 1 :(得分:1)

我实际上最终找到了解决这个问题的方法。如果通过调用hot.getCellMeta()函数设置单元格的注释。

这实际上绕过了双手的重新渲染。请参阅下面的更新功能。

// Apply comments to a whole row in a passed handsontable
var applyCommentsToRow = function (hot, comment, logicalrow) {
  var cols = hot.countCols();
  for (var i = 0; i < cols; i++) {
    // New method of writing comment to cell. Does not cause handsontable re-render.
    hot.getCellMeta(logicalrow, i).comment = {'value':responseComments};
  }
  // Call render once after all comments have been assigned to row!
  hot.render();
}