Я создаю повторно используемую таблицу данных, используя ngx-datatable, и я хотел бы, чтобы динамические компоненты отображались внутри детали строки. Компонент datatable получает класс компонента в качестве аргумента от родительского модуля, и я использую ComponentFactory для createComponent. Я вижу, что конструктор и методы onInit работают для динамического компонента, но он не присоединен к DOM.
Вот как HTML-код данных выглядит для детализации строк:
<!-- [Row Detail Template] -->
<ngx-datatable-row-detail rowHeight="100" #myDetailRow (toggle)="onDetailToggle($event)">
<ng-template let-row="row" #dynamicPlaceholder let-expanded="expanded" ngx-datatable-row-detail-template>
</ng-template>
</ngx-datatable-row-detail>
<!-- [/Row Detail Template] -->
И вот как выглядит мой .ts файл:
@ViewChild('myDetailRow', {static: true, read: ViewContainerRef}) myDetailRow: ViewContainerRef;
@ViewChild('dynamicPlaceholder', {static: true, read: ViewContainerRef}) dynamicPlaceholder: ViewContainerRef;
renderDynamicComponent(component) {
var componentFactory = this.componentFactoryResolver.resolveComponentFactory(component);
var hostViewConRef1 = this.myDetailRow;
var hostViewConRef2 = this.dynamicPlaceholder;
hostViewConRef1.createComponent(componentFactory);
hostViewConRef2.createComponent(componentFactory);
}
Другой момент заключается в том, что если мой #dynamicPlaceholder
ng-шаблон находится вне ngx-datatable, он работает, и динамический модуль отображается и отображается.
angular
ngx-datatable
Рагхав Канвал
источник
источник
<ng-content>
тега для отображения любой вложенной разметки.Ответы:
Мы не можем отобразить компонент в Template (
<ng-template>
) во время выполнения,createComponent
потому что afaik шаблоны обрабатываются Angular во время компиляции. Поэтому нам нужно решение, которое работает во время компиляции.
Решение с недостатками
ng-content
можете помочь нам здесь:Затем мы можем передать все, что мы хотим, в подробный вид:
Но есть проблема: мы не можем использовать,
ng-content
когда хотим получить доступ к текущей строке в переданном шаблоне.Решение
Но
ngx-datatable
укрыл нас. Мы можем передать шаблон вngx-datatable-row-detail
директиву:Затем шаблон может быть передан из любого внешнего компонента через
@Input
переменную:Взгляните на stackblitz , где я написал
my-table
компонент как poc.источник
Stackblitz
Изменить: я возился с
ngx-datatable
источником печальная часть этогоngx-datatable-row-detail
не является компонентом, но директива, и он не привязан к DOM. Так что это не имеетViewContainer
ссылки. Это делает введение элементов в него немного сложным. Что вы можете сделать, это определить шаблоны в вашем компоненте и использоватьTemplateRef
s и назначить их в том месте, где вы визуализируете свой компонент.источник
el.setAttribute is not a function
ошибку в методе componentFactory.create. Есть идеи, почему это может происходить? this.dynamicPlaceholder.elementRef.nativeElement возвращает комментарий, не так ли?