Angular2: как передать дочернее содержимое в директиву?

#angular

#angular

Вопрос:

У меня есть пользовательская директива, которая динамически загружает компонент на основе некоторого ввода, пока эта часть работает:

 <ng-container customDirective [variant]="something"></ng-container>
 

Используя ComponentFactoryResolver и ViewContainerRef , я могу затем создать соответствующий компонент на основе значения variant . Пока это работает.

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

 <ng-container customDirective [variant]="something">
  <span>I want to be inside the dynamic component!</span>
  <span>me too!</span>
</ng-container>
 

Простое использование <ng-content></ng-content> внутри шаблона динамического компонента не приводит к отображению дочерних элементов.

Кажется, мне нужно передать дочерние createComponent элементы, что-то вроде этого:

 const headerInstanceRef = this.viewContainerRef.createComponent<Component>(
  componentFactory,
  0,
  undefined,
  [
    // pass children here, somehow    
  ]
);
 

Но я не могу понять, как их извлечь. Я пытался использовать ContentChildren и ViewChildren в директиве, но оба подходят undefined .

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

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

1. Я думаю, вы все равно можете использовать <ng-content>, но тогда вашему шаблону также нужен второй контейнер, который вы можете настроить как ViewContainerRef, в котором вы можете создать свой компонент (вы можете установить ссылку на локальный шаблон для этого контейнера, чтобы настроить его с помощью ViewChild).. имеет ли это смысл?

2. @MikeOne не совсем, извините! мой angular не настолько силен

3. К сожалению, я нахожусь на мобильном телефоне, поэтому что-то кодировать — непростая задача. Вопрос здесь в том, нужен ли вам контейнер, в котором есть ваш динамический компонент, а рядом с ним содержимое, которое вы передаете? Или вам нужно, чтобы это передавалось в содержимом внутри вашего динамического компонента?