Мне нужно реализовать директиву, которая добавляет элементы HTML внутри его элемента хоста, а также помещает все содержимое элемента в определенную c часть HTML, по сути, оборачивая содержимое, подобно тому, как Angular Материал оборачивает содержимое <button mat-button>
<span class="mat-button-wrapper">
.
Например, компонент будет помещен в шаблон, подобный следующему:
<div my-directive>
my text
</div>
И это должно быть rendered:
<div my-directive>
<div class="my-class">
my text
</div>
</div>
Я пытался использовать WrapperComponent и добавить его в ViewContainerRef директивы, как показано ниже.
import { Directive, TemplateRef, ViewContainerRef, Component, Renderer2, ElementRef, ComponentFactoryResolver, ViewChild, ComponentRef } from '@angular/core';
@Component({
selector: 'my-wrapper',
template: `
<div class="my-wrapper">
<ng-content></ng-content>
</div>
`
})
export class WrapperComponent {
}
@Directive({
selector: '[wrapContent]'
})
export class WrapContentDirective{
wrapperRef: ComponentRef<WrapperComponent>;
constructor(
private renderer: Renderer2,
private templateRef: TemplateRef<any>,
private vcr: ViewContainerRef,
private cfr: ComponentFactoryResolver,
hostElement: ElementRef
) {
const wrapperFactory = this.cfr.resolveComponentFactory(WrapperComponent);
this.wrapperRef = this.vcr.createComponent(wrapperFactory);
}
}
Но оболочка отображается рядом с элементом, и не внутри И мне все еще нужно выяснить, как проецировать содержимое ng-контента в WrapperComponent.
Как я могу это реализовать?