Как скрыть категорию, когда в ней нет элементов?

#javascript #angular

#javascript #angular

Вопрос:

У меня есть два массива в моем приложении Angular, один из которых представляет собой массив объектов с категориями, а другой массив с элементами, в котором есть свойство object, в котором указано, к какой категории принадлежит элемент.

Итак, я создал несколько пользовательских каналов, один из которых возвращает все элементы, если выбрана категория «все», и два других канала для массива элементов, которые возвращают отфильтрованные элементы для каждой категории и другой канал для поиска.

Элементы отображаются с именем категории, когда выбрано «все», но когда я ищу элемент, я бы скрыл метку категории, если в ней нет элементов.

Как я могу ее архивировать?

Вот мое *ngFor место, где я рендерю материал:

 <div
   *ngFor="
   let cat of category
   | menuFiltered
   : (selected === -1 ? -1 : category[selected].id)
   "
   class="products"
   >
   <h2>{{ category.desc }}</h2> // i need to hide this if the below plus array in search is empty
   <hr />
   <div
      *ngFor="
      let plu of plus
      | pluFiltered: men.id
      | pluSearch: searchModel
      "
      class="row mb-3 product"
      >
      ...
   </div>
</div>
  

Редактировать:
Массивы выглядят так:

 menu = [{id: 123, codmen: 2, desc: "ANTIPASTI", estesa: ""}, {id: 127, codmen: 5, desc: "PRIMI", estesa: ""}, {id: 128, codmen: 6, desc: "SECONDI", estesa: ""}] // this is the "category"

plus = [{desc: "SFOGLIATINA AL CARTOCCIO", menu: 123}, {desc: "SFOGLIATINA AL CARTOCCIO", menu: 127}, {desc: "SFOGLIATINA AL CARTOCCIO", menu: 128}] // menu is the actualy id of menu array to which item belong
  

Как только я получаю элементы из своего API, я удаляю из массива меню все объекты, в которых нет ни одного элемента, вот так:

 this.menu = this.menu.filter((menu) =>
  this.plus.some((item) => item.menu === menu.id)
);
  

И вот мои каналы:

menuFiltered труба:

 export class MenuFilteredPipe implements PipeTransform {

  transform(list: any[], menu: number): any {
    return list ? menu === -1 ? list : list.filter(item => item.id === menu) : [];
  }

}
  

pluFiltered труба:

 export class PluFilteredPipe implements PipeTransform {

  transform(list: any[], menu: number): any {
    return list ? list.filter(item => item.menu === menu) : [];
  }
}
  

И pluSearch труба:

 export class PluSearchPipe implements PipeTransform {

  transform(list: any[], filterText: string): any {

    return list ? list.filter(item => item.desc.search(new RegExp(filterText, 'i')) > -1) : [];

  }

}
  

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

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

2. @MichaelD добавил мои каналы и массивы

Ответ №1:

Попробуйте использовать ng-контейнер с *ngIf:

 <div
 *ngFor="let cat of category| menuFiltered: (selected === -1 ? -1 : category[selected].id)" class="products">
  <ng-container *ngIf="plus | pluFiltered: men.id | pluSearch: searchModel as plusArray">
    <h2 *ngIf="plusArray.length > 0">{{ category.desc }}</h2>
     <div *ngFor="let plu of plusArray" class="row mb-3 product">
       ...
     </div>
  </ng-container>
</div>
  

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

1. На самом деле я еще использовал ng-контейнер, чтобы показать скелет следующим образом: <ng-container *ngIf=" plus.length else skeletonTemplate " > ваше решение работает, но как я могу в том же *ngIf все еще использовать plus.length else skeletonTemplate ?