Как в angular определить, сколько компонентов в ng-контенте?

#angular

#angular

Вопрос:

Теперь у меня есть два компонента

 //app-row-two
<div>
  <div x-col><ng-content select="[slot=1]"></ng-content></div>
  <div x-col><ng-content select="[slot=2]" ></ng-content></div>
</div>
//app-row-three
<div>
  <div x-col><ng-content select="[slot=1]"></ng-content></div>
  <div x-col><ng-content select="[slot=2]" ></ng-content></div>
  <div x-col><ng-content select="[slot=3]" ></ng-content></div>
</div>
  

Для двух и трех столбцов. И когда я использую его, нужно написать slot =»1″ и т.д.
Есть ли способ объединить его в один компонент, который определяет, сколько компонентов в ng-контенте, и создает столбцы?

Ответ №1:

В Angular есть декоратор, который позволяет компоненту обнаруживать и запрашивать внутренних дочерних элементов, это ContentChildren декоратор.

Я создал рабочий образец Stackblitz, используя его для подсчета количества дочерних элементов, вставленных в ng-контент. Вы можете использовать директиву или базовый абстрактный класс.

Вот ссылка Angular Docs на этот подход.

Чтобы их можно было обнаружить, вам нужно сообщить Angular, как он будет находить дочерние элементы, в данном случае я использую директиву:

 @Directive({ selector: "[option]" })
export class Option {}

@Component({
  selector: "container",
  template: `
    <ng-content></ng-content>
    <strong>I have {{ childrensLength }} childrens</strong>
  `
})
export class ContainerComponent {
  @ContentChildren(Option) options: QueryList<Option>;

  get childrensLength(): number {
    return this.options ? this.options.length : 0;
  }
}
  
 <container>
    <div option>I am queryable!</div>
    <div option>Me too!</div>
    <div option>Me as well...</div>
    <div>I am not queryable</div>
</container>
  

Вывод:

Вывести образец с отображаемым результатом в браузере