我有一个函数可以将注释更新到一行中的每个单元格。此函数由更高级别的函数多次调用,该函数循环遍历表中的每一行并确定要应用的注释。
一切正常。请参阅下面代码的简化版本。
// 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?通过暂时禁用所有渲染或以不同方式添加注释?
答案 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();
}