2

我将 SlickGrid 与 dataView 一起使用。当网格加载时,我应用了条件格式来突出显示特定行:

grid.addCellCssStyles("highlight", rowColor);
grid.invalidate();
dataView.syncGridCellCssStyles(grid, "highlight")
grid.render();

应用过滤器时,我想删除 css 样式。我努力了:

grid.removeCellCssStyles("highlight");
dataView.syncGridCellCssStyles(grid, "highlight")

应用过滤器时,render()会调用两次。第一次,样式被成功删除,但第二次render()运行它被重新应用。第一次render()被调用onRowCountChanged(),第二次被调用onRowsChanged()。似乎在第二次渲染中,updateCellCssStylesOnRenderedRows(addedHash, removedHash)正在使用行的缓存版本来重新应用样式。有趣的是,过滤器隐藏的所有行的样式都会被清除,但未过滤的行会保留样式。因此,当我删除过滤器时,隐藏的行已删除样式,但未过滤的行仍突出显示。

附注,我是一个完全的菜鸟。任何帮助是极大的赞赏。

更新:在 slick.dataview.js, 中syncGridCellCssStyles(grid, key),我注释掉storeCellCssStyles(grid.getCellCssStyles(key));并达到了我想要的结果。我显然不想编辑源代码作为我的最终解决方案,但希望这将有助于诊断问题。见下面的结果:

函数syncGridCellCssStyles(网格,键){

  var hashById;
  var inHandler;

  // since this method can be called after the cell styles have been set,
  // get the existing ones right away
  //storeCellCssStyles(grid.getCellCssStyles(key));

  function storeCellCssStyles(hash) {
    hashById = {};
    for (var row in hash) {
      var id = rows[row][idProperty];
      hashById[id] = hash[row];
    }
  }

  grid.onCellCssStylesChanged.subscribe(function(e, args) {
    if (inHandler) { return; }
    if (key != args.key) { return; }
    if (args.hash) {
      storeCellCssStyles(args.hash);
    }
  });

  this.onRowsChanged.subscribe(function(e, args) {
    if (hashById) {
      inHandler = true;
      ensureRowsByIdCache();
      var newHash = {};
      for (var id in hashById) {
        var row = rowsById[id];
        if (row != undefined) {
          newHash[row] = hashById[id];
        }
      }
      grid.setCellCssStyles(key, newHash);
      inHandler = false;
    }
  });
}
4

0 回答 0