Я пытаюсь создать набор компонентов, которые позволят мне визуализировать таблицу, где «пользователю» нужно только предоставить:
- данные (2-й массив)
- шаблон ячейки для каждого столбца
Итак, в идеале , вы можете использовать эти компоненты для рендеринга таблицы из 3 столбцов, например:
<app-table [data]='sampleData'>
<td>{{cell.toString().toUpperCase()}}</td>
<td class="myClass">{{cell}}</td>
<app-cell [cell]="cell"></app-cell>
</app-table>
... идея состоит в том, что компонент app-table
будет отображать три app-column
компонента для каждой строки и магически предоставлять значение ячейки для каждого столбца как cell
.Пользователь компонента получает полный контроль над тем, как визуализируется каждый столбец, в том числе какие классы применяются к тегу td
и т. Д.
Мне не повезло, пытаясь добиться этого.Лучшее, что я придумала до сих пор, можно увидеть в этом StackBlitz , где у меня есть app-table
компонент, который отображает tr
, и который ожидает, что его содержимое включает один ng-template
длякаждый столбец.Разметка не так чиста, как указанная выше псевдо-разметка:
<app-table [data]='sampleData'>
<ng-template let-cell="cell"><td>{{cell.toString().toUpperCase()}}</td></ng-template>
<ng-template let-cell="cell"><td class="myClass">{{cell}}</td></ng-template>
<ng-template let-cell="cell"><td><app-cell [data]="cell"></app-cell></td></ng-template>
</app-table>
Это немного уродливо из-за всей дополнительной разметки, необходимой для передачи данных в шаблон, но это не самая большая проблема.
Вы заметите, что в последнем «столбце» используется компонент app-cell
, но этот компонент все еще заключен в тег td
:
<ng-template let-cell="cell">
<td>
<app-cell [data]="cell"></app-cell>
</td>
</ng-template>
Это не совсем то, что яwanted: я бы хотел, чтобы компонент app-cell
предоставил сам тег td
, поскольку в противном случае он не может (например) установить классы для этого элемента.
В настоящее время компонент app-cell
имеетHostBinding
, который добавляет класс ("foo"), но добавляется к самому элементу app-cell
, а не к элементу td
, где это необходимо:
<td>
<app-cell class="foo">
<div>...</div>
</app-cell>
</td>
Очевидная вещь длясделать это, чтобы переместить тег td
в компонент app-cell
, но если я сделаю это , то визуализированный HTML-код будет выглядеть следующим образом:
<app-cell class="foo">
<td>
<div>...</div>
</td>
</app-cell>
[OK, поэтомукласс по-прежнему применяется не в том месте, но легко увидеть, как переместить его в td
tag.]
Однако этот дополнительный псевдоэлемент, расположенный между элементами tr
и td
, беспокоит меня - браузер, который я использую, кажется, не возражает, но я подозреваю, что оченьмоего CSS будет выброшен им, потому что есть селекторы, которые ожидают, что td
будет прямым потомком tr
.
Есть ли способ избавиться от этой дополнительной псевдо-элемент?Обычно я мог бы взглянуть на использование директивы, но я не вижу, как я могу это сделать здесь, потому что компоненту app-cell
нужен шаблон, а директивам его нет ...