Как вложить html при циклическом просмотре массива с использованием Angular ngFor / ng-template?

#angular #ngfor #ng-template

#angular #ngfor #ng-template

Вопрос:

Я пытаюсь вывести html в следующем формате для массива

weekDaysHeaderArr длина которого равна 42 = 6 x 7.

Другими словами, я хочу вложить все 7 элементов столбца div в строку div (всего 6) вот так.

 <div class="row">
    <div class="col-md-auto"> <-- **repeated 7 times**
    </div>
</div>
<div class="row">
    <div class="col-md-auto"> <-- **repeated 7 times**
    </div>
</div>
<div class="row">
    <div class="col-md-auto"> <-- **repeated 7 times**
    </div>
</div>
<div class="row">
    <div class="col-md-auto"> <-- **repeated 7 times**
    </div>
</div>
<div class="row">
    <div class="col-md-auto"> <-- **repeated 7 times**
    </div>
</div>
<div class="row">
    <div class="col-md-auto"> <-- **repeated 7 times**
    </div>
</div>
  

Я могу использовать ngFor , очевидно, для создания одного и того же html-элемента ( div class="col-md-auto"> ) 42 раза, но как мне вложить каждые 7 элементов внутри <div class="row"> ?

Я не использовал ng-template и ng-container раньше, и я не могу разобраться в документации, можно ли их использовать для этого? Насколько я могу судить, они предназначены для переключения между элементами html, а не для вложения.

Ответ №1:

Создайте матрицу из своего массива

 private weekDaysHeaderArr = [ /*Your elements here*/ ]
private groupSize: number = 7;
get matrix(){ 
  return this.weekDaysHeaderArr.map((item, index, arr)=>{
    return index % this.groupSize === 0 ? arr.slice(index, index   this.groupSize) : null; 
  })
  .filter((item) => { return item; });
}  

Затем используйте его внутри вашего шаблона следующим образом

 <div class="row" *ngFor="let week of matrix">
    <div class="col-md-auto" *ngFor="let day of week">
    </div>
</div>  

Комментарии:

1. должно быть this.groupSize но да, работает из коробки

Ответ №2:

Вложение циклов for в шаблон angular довольно простое. Учитывая, что у вас есть два отдельных массива, вы можете сделать следующее:

 const sixThings = [1, 2, 3, 4, 5, 6]

const weekdays = ['mon', 'tue', 'wed']

<div class="row" *ngFor="let thing of sixThings"> <-- **repeated 6 times**
    <div class="col-md-auto" *ngFor="let weekday of weekdays"> <-- **repeated 7 times**
    </div>
</div>
  

Я обновлю ответ позже для случая, когда у вас уже есть вложенный массив или вы можете его создать.

Ответ №3:

Вы можете сделать что-то вроде этого….

 <div class="row" *ngFor="let week of [0,1,2,3,4,5]">
    <div class="col-md-auto" *ngFor="let day of [0,1,2,3,4,5,6]">
    </div>
</div>
  

затем, чтобы получить индекс из weekDaysHeaderArr, вы можете сделать….

  weekDaysHeaderArr[week * 7   day];
  

Комментарии:

1. Я получаю Binding expression cannot contain chained expression at the end of the expression при попытке использовать weekDaysHeaderArr[week * 7 day];

2. @AndrewAllen Можете ли вы полностью отобразить HTML из внешнего цикла?

3. @AndrewAllen если вы хотите использовать let day of week, вы можете определить week как Array(6).заполните([0,1,2,3,4,5,6]) и используйте индекс недели внутри weekDaysHeaderArr