Программно передавать спроектированный контент детям? (в противном случае это было бы преобразовано в <ng-content>)
Скажи, у меня есть <hook>
компонент, который программно создает дочерний элемент, как я могу передать контент (который Angular будет отображать в <ng-content></ng-content>
в шаблоне ловушки) вместо ng-содержимого для этого дочернего компонента (который может или не может решить его отображать)?
<hook ...>
Dynamic content should be passed to hook's programmatically created child
</hook>
Я нашел очень полезное объяснение проекции контента, которое показывает, как передать проецируемый контент программно созданному компоненту, что составляет половину моей проблемы. Для меня по-прежнему отсутствует ссылка: как получить доступ к контенту, переданному вhook
передать это дальше.
1 ответ
Если бы я полностью понял проблему, вот решение:
app.component.ts
@Component({
selector: 'my-app',
template: `
<h1>App comp</h1>
<hook>
awesome content here
</hook>
`
})
export class AppComponent { }
hook.component.ts
@Component({
selector: 'hook',
template: `
<h2>Hook comp</h2>
<ng-template #content>
<ng-content></ng-content>
</ng-template>
<ng-container #vc></ng-container>
`
})
export class HookComp {
@ViewChild('content', { static: true, read: TemplateRef })
contentTpl: TemplateRef<any>;
@ViewChild('vc', { static: true, read: ViewContainerRef })
vc: ViewContainerRef;
constructor (
private cfr: ComponentFactoryResolver,
private injector: Injector,
) { }
ngAfterViewInit () {
this.createChildComp();
}
private createChildComp () {
const compFactory = this.cfr.resolveComponentFactory(HookChildComp);
const componentRef = this.vc.createComponent(compFactory);
componentRef.instance.contentTpl = this.contentTpl;
componentRef.changeDetectorRef.detectChanges();
}
}
крючок-child.component.ts
@Component({
selector: 'hook-child',
template: `
<h3>Hook child comp</h3>
<ng-container *ngTemplateOutlet="contentTpl"></ng-container>
`
})
export class HookChildComp {
contentTpl: TemplateRef<any>;
}
Как видите, я могу схватить hook
с ng-content
завернув его в ng-template
. Затем я могу просто запросить этот шаблон и передать его программно созданному потомку.