在冻结列上调用 updateColumnDefinition 会在 ResizeColumns 中抛出异常,并永久性地损坏冻结列偏移量
请描述该错误。 https://jsfiddle.net/bnj37v5e/ 将 updateColumnDefinition() 方法应用于当前冻结的列时,会出现 TypeError: column.element.after 不是函数,并使 FrozenColumns.leftColumns 保留已删除的列。随后,所有位于该过时条目之后的冻结列都会被偏移一列宽,因此它们会在第一个滚动列上显示,并在水平滚动时保持在该位置。 它不会自行恢复。每次后续重新渲染触及冻结列时,都会再次在同一死条目上抛出错误,因此随后的列删除操作永远不会触发 column-deleted。在一个应用程序中,如果在一次渲染中重新标记一组列,则第一次失败会带走整个渲染过程。 问题的原因是 Column.delete() 中的排序问题(src/js/core/column/Column.js),其中包含以下内容: this.element = false; this.table.columnManager.deregisterColumn(this); this.table.columnManager.rerenderColumns(true); this.dispatch("column-deleted", this); 步骤 3 触发宽度重新计算,该计算会触发 ResizeColumns.columnWidthUpdated(),对于冻结列而言,它会迭代 FrozenColumns.leftColumns: columnWidthUpdated(column){ if(column.modules.frozen){ if(this.table.modules.frozenColumns.leftColumns.includes(column)){ this.table.modules.frozenColumns.leftColumns.forEach((col) => { this.reinitializeColumn(col); }); … FrozenColumns 尚未被告知删除操作 — 这就是步骤 4 — 因此列表仍包含在步骤 1 中元素被置为空的列。 reinitializeColumn() 以 column.element.after(column.modules.resize.handleEl); 结束,该操作会在 false 上抛出错误。该错误会传播到 Column.delete() 中的 Promise 执行器中,因此步骤 4 永远不会运行,FrozenColumns 也不会重建。由于 updateDefinition() 在删除原始列之前添加了替换列,因此存活下来的列包含两个副本 — 因此多了一个条目和一个列偏移。
内容来源: tabulator-tables/tabulator