Как получить доступ к нескольким элементам, сгенерированным из директивы ngFor в Angular?

#javascript #html #angular #typescript

Вопрос:

Я хочу добавить класс CSS к элементам div, созданным с помощью директивы *ngFor Angular. Во-первых, я попробовал использовать директиву @ViewChild и Render2, но, похоже, она не работает с несколькими элементами. Во-вторых, я попытался манипулировать элементами div с помощью директивы @ViewChildren, но не смог найти подходящего примера синтаксиса, который бы работал для меня. Как я могу получить доступ к этим элементам и работать с их списком классов?

Сообщение об ошибке, которое я получаю, выглядит так: Error: Uncaught (in promise): TypeError: el.classList is undefined addClass

HTML

  <div
    class="row" #rowDiv
    *ngFor="let courtReservation of currentIntervalReservations"
 >
      <div class="court">
        <h1 class="court-name">{{ courtReservation.courtName }}</h1>
      </div>
      <lp-player-diagram
        *ngFor="let res of courtReservation.reservations; let i = index"
        [playerName]="res.playerName"
        [index]="i"
      ></lp-player-diagram>
 </div>
 

тс

 export class MainGantogramComponent implements OnInit, AfterViewInit {   
   @ViewChildren('rowDiv') rowElements?: QueryList<HTMLDivElement>;

   constructor(private renderer: Renderer2) {}

   /* ... */

   setGridTemplateClass(currentTime: Time) {
      if (currentTime.minutes == 0) {
        this.rowElements?.forEach((div) =>
          this.renderer.addClass(div, 'short-grid-template')
        );
      } else {
        this.rowElements?.forEach((div) =>
          this.renderer.addClass(div, 'standard-grid-template')
        );
      }
   }
}
 

Ответ №1:

Если я вас правильно понял, вы можете просто использовать поле для хранения нужного вам css-класса:

  <div
    class="row"
    [ngClass]="gridClass"
    *ngFor="let courtReservation of currentIntervalReservations"
 >
      <div class="court">
        <h1 class="court-name">{{ courtReservation.courtName }}</h1>
      </div>
      <lp-player-diagram
        *ngFor="let res of courtReservation.reservations; let i = index"
        [playerName]="res.playerName"
        [index]="i"
      ></lp-player-diagram>
 </div>

----

setGridTemplateClass(currentTime: Time) {
  this.gridClass = currentTime.minutes === 0 ? 'short-grid-template' : 'standard-grid-template'
}
 

вот как это работает в angular, Renderer очень редко используется