如何根据数据动态设置行样式?

How to set row style dynamically depend on data?

好的,我需要设置一些样式规则,例如整行的背景色 (对于 Ag-grid,取决于一些不需要的数据显示或在 table 中。 另外,table里面有很多数据,是排序的,实时更新的。 哪种方式更好?

我在我的项目中使用 Angular 6 和 ag-grid ^17.1.1。

由于行的样式取决于某个值,我将此值添加到 table 并将隐藏标志设置为 true。然后我就设置 getRowStyle function in gridOptions.

getRowStyle: (params) => {
  if (params.data.type === 'car' && params.data.value === 'audi') {
    return { 'background-color': 'green' };
  }
  if (params.data.type === 'car' && params.data.value === 'ford') {
    return { 'background-color': 'blue' };
  }
}

也许,有更好的方法吗?

为了使用 ag-Grid,我的建议是为该行设置 class,并让 class 成为为每种情况应用您需要的任何样式的行。我建议使用 class 而不是直接样式,因为它更干净、更快(参见此处 Inline Styles vs Classes

我认为在 ag-Grid 文档中显示了执行此操作的方法 https://www.ag-grid.com/javascript-grid-row-styles/#row-class-rules

具体来说,我认为这个例子是最干净、最直接的。

gridOptions.rowClassRules: {
  // apply green to 2008
  'rag-green-outer': function(params) { return params.data.year === 2008},

  // apply amber 2004
  'rag-amber-outer': function(params) { return params.data.year === 2004},

  // apply red to 2000
  'rag-red-outer': function(params) { return params.data.year === 2000}
}

或 shorthand 版本

gridOptions.rowClassRules: {
    'rag-green': 'data.age < 20',
    'rag-amber': 'data.age >= 20 && data.age < 25',
    'rag-red': 'data.age >= 25'
}

原答案

直接的答案是绑定到 [ngStyle],就像我直接从 angular.io 这里举的例子 https://angular.io/guide/template-syntax#ngStyle

<div [ngStyle]="currentStyles">
  This div is initially italic, normal weight, and extra large (24px).
</div>
  this.currentStyles = {
    'font-style':  this.canSave      ? 'italic' : 'normal',
    'font-weight': !this.isUnchanged ? 'bold'   : 'normal',
    'font-size':   this.isSpecial    ? '24px'   : '12px'
  };

但我也建议您尝试样式绑定,它使用模板语法根据内容动态设置样式。

<div [style.background-color]="isFordCar(data) ? 'blue' : 'green'" >
</div>

或者更好的是,为什么不使用 class,它最终更简洁并且共享相同类型的绑定语法

<div [class.ford]="isFordCar(data)" >
</div>