2

私は dataView で SlickGrid を使用しています。条件付き書式を適用して、グリッドが読み込まれたときに特定の行を強調表示しました。

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

フィルターが適用されている場合、css スタイルを削除したいと考えています。私が試してみました:

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

フィルターが適用されると、render()が 2 回呼び出されます。1 回目はスタイルが正常に削除されますが、2 回目のrender()実行では再適用されます。1 回目render()は によって呼び出されonRowCountChanged()、2 回目は によって呼び出されonRowsChanged()ます。2 回目のレンダリングでupdateCellCssStylesOnRenderedRows(addedHash, removedHash)は、行のキャッシュ バージョンを使用してスタイルを再適用しているようです。興味深いことに、フィルタによって非表示になっているすべての行のスタイルはクリアされますが、フィルタされていない行のスタイルは保持されます。そのため、フィルターを削除すると、非表示だった行のスタイルが削除されますが、フィルター処理されていない行は引き続き強調表示されます。

余談ですが、私はまったくの初心者です。どんな助けでも大歓迎です。

更新: slick.dataview.js でsyncGridCellCssStyles(grid, key)、コメントアウトしstoreCellCssStyles(grid.getCellCssStyles(key));て目的の結果を達成しました。最終的な解決策としてソース コードを編集したくないのは明らかですが、これが問題の診断に役立つことを願っています。以下の結果を参照してください。

function 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