Как раскрасить разные строки в ngFor Angular 5

Я создаю таблицу, в которой несколько строк загружены из *ngFor:

    <tr *ngFor = "let car of cars">
      <td>{{car?.id}}</td>
      <td>{{car?.date | date : "short"}}</td>
      <div [ngSwitch] = "car?.state">
          <td *ngSwitchCase=1 class = "col">Sold</td>
          <td *ngSwitchCase=7 class = "col">Repaired</td>
          <td *ngSwitchDefault class = "col">Out of stock</td>
      </div>
    </tr>

И я хочу, чтобы каждый ряд был окрашен в свой цвет, это будет зависеть от состояния машины. Я знаю, как это делать со статическим контентом, но не в том случае, если он поступает из базы данных, и мне нужно загрузить его с помощью директивы *ngFor.

Поскольку я использую bootstrap, я хотел бы использовать стиль класса .table-success для состояния 1, .table-info для состояния 7 и primary для состояния по умолчанию.

<tr class = "table-success">
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
0
0
630
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Напишите стили с вашими требованиями с возможными названиями состояний автомобиля.

возьмем. Если вы получите статус автомобиля доставлен.

затем написать

.delivered{
  background: green,
  color: black
 } 
<tr [ngClass] = "{{car.status}}" *ngFor = "let car of cars">
  <td>{{car?.id}}</td>
  <td>{{car?.date | date : "short"}}</td>
  <div [ngSwitch] = "car?.state">
      <td *ngSwitchCase=1 class = "col">Sold</td>
      <td *ngSwitchCase=7 class = "col">Repaired</td>
      <td *ngSwitchDefault class = "col">Out of stock</td>
  </div>
</tr>

Вероятно, вы захотите использовать директиву ngClass:

[ngClass] = "{'table-success' : car.state == 1}"

Поскольку у вас есть несколько вариантов, и их может быть немного сложно читать, вы можете добавить метод в файл компонента .ts.

[ngClass] = "getClasses(value)"

И создайте метод getClasses, который возвращает правильный класс для элемента.

Но в конце концов, если у вас уже есть переключатель, почему бы вам просто не сделать это:

 <td *ngSwitchCase = "1" class = ".table-success col">Sold</td>
 <td *ngSwitchCase = "7" class = ".table-info col">Repaired</td>
 <td *ngSwitchDefault class = "col">Out of stock</td>

добавьте классы к переключателю, который у вас уже есть :)

Ответ принят как подходящий

Во-первых, <div> внутри <tr> не будет работать, здесь вам подойдет <ng-container>. Это специальный тег, используемый только в компиляторе angular, который преобразуется в комментарий HTML.

Кроме того, вам не хватает некоторых двойных кавычек для вашего *ngSwitchCase.

Что касается классов, вы можете использовать привязку [class.class-name] или [ngClass], если считаете, что это более структурировано:

<tr *ngFor = "let car of cars" class = "table-primary" 
    [class.table-success] = "car.state === 1"  [class.table-info] = "car.state === 7">
  <td>{{car?.id}}</td>
  <td>{{car?.date | date : "short"}}</td>
  <ng-container [ngSwitch] = "car?.state">
      <td *ngSwitchCase = "1" class = "col">Sold</td>
      <td *ngSwitchCase = "7" class = "col">Repaired</td>
      <td *ngSwitchDefault class = "col">Out of stock</td>
  </ng-container>
</tr>

Это именно то, что я искал. Большое спасибо!

Samuel 02.05.2018 15:14

Вы можете использовать ngClass. В строке таблицы:

<tr [ngClass] = "{'table-success': (car?.state=='1'), 'table-info': (car?.state=='7'), 'primary': (car?.state=='7' && car?.state=='1')}" *ngFor = "let car of cars">

Другие вопросы по теме