Angular 我可以要一个不';不呈现伪元素?
我正在尝试创建一组组件,使我能够呈现一个表,其中“用户”只需要提供:Angular 我可以要一个不';不呈现伪元素?,angular,angular-components,Angular,Angular Components,我正在尝试创建一组组件,使我能够呈现一个表,其中“用户”只需要提供: 数据(二维阵列) 每列的单元格模板 因此,理想情况下,您可以使用这些组件呈现3列表,如下所示: <app-table [data]='sampleData'> <td>{{cell.toString().toUpperCase()}}</td> <td class="myClass">{{cell}}</td> <app-cell [cell]=
- 数据(二维阵列)
- 每列的单元格模板
<app-table [data]='sampleData'>
<td>{{cell.toString().toUpperCase()}}</td>
<td class="myClass">{{cell}}</td>
<app-cell [cell]="cell"></app-cell>
</app-table>
这有点难看,因为将数据向下传递到模板中需要所有额外的标记,但这不是最大的问题
您会注意到最后一个“列”使用了app cell
组件,但该组件仍然包装在td
标记中:
<ng-template let-cell="cell">
<td>
<app-cell [data]="cell"></app-cell>
</td>
</ng-template>
显然要做的事情是将td
标记移动到app cell
组件中,但是如果是I,则呈现的HTML如下所示:
<app-cell class="foo">
<td>
<div>...</div>
</td>
</app-cell>
...
[好的,因此类仍然应用在错误的位置,但是很容易看到如何将其向下移动到td
标记。]
然而,位于tr
和td
元素之间的额外伪元素让我担心——我使用的浏览器似乎不介意,但我怀疑我的大部分CSS都会被它抛出,因为有选择器期望td
是tr
的直接子元素
有没有办法去掉额外的伪元素?通常我可能会考虑使用指令,但我不知道如何在这里做到这一点,因为
app cell
组件需要一个模板,而指令没有这些…来回答我自己的问题-因为我在“相关”侧栏中发现:我可以使用属性选择器而不是元素选择器
这显示了结果。这些类型的组件是我最喜欢的。在一天结束时,假设你有这样的数据,你会想要下面这样的东西
carData = [{
model: 'Mercedes',
year: 2015,
km: 10000
}, {
model: 'Audi',
year: 2016,
km: 5000
}];
您希望按原样显示前两列,而对于最后一列,您希望显示一些自定义模板
首先为单元格的自定义主体模板定义一个指令。(您也可以对标题执行相同的操作)
@指令({选择器:'[custom cell body]})
导出类AppCellBodyTemplate{
构造函数(公共模板:TemplateRef){}
}
让我们定义我们的AppCellComponent
app cell.component.ts
@组件({
选择器:“应用程序单元”,
模板:``
})
导出类AppCellComponent{
@输入()头;
@输入()字段;
@Input()样式类;
@ContentChild(AppCellBodyTemplate)customBody:AppCellBodyTemplate;
}
让我们将它们粘在AppTableComponent
app table.component.ts
@组件({
选择器:“应用程序表”,
templateUrl:“./app table.component.html”
})
导出类AppTableComponent{
@输入()数据:任意[];
@ContentChildren(AppCellComponent)单元格:QueryList;
}
app table.component.html
{{cell.header}
{{row[cell.field]}
这里有几点需要解释
template:TemplateRef
在AppCellBodyTemplate
由于我们将始终使用自定义体细胞
和ng模板
s,因此我们可以获得在中定义的模板的引用。此模板
将在*ngTemplateOutlet
@ContentChild(AppCellBodyTemplate)在AppCellComponent
中的customBody
用于检测是否存在定义为ContentChild
@ContentChildren(AppCellComponent)cells:QueryList
用于获取cells
的实例(您做了类似的事情)
context:{$implicit:row}
是向该组件的使用者公开一些数据$implicit
使您能够使用所需的任何模板变量检索此上下文。因为我在这里使用了$implicit
,所以我可以这样做
,否则,我必须定义我的car
变量,类似这样的let car=“rowData”
但是,您仍然必须在模板中编写td
。我将发布一个更好的方法来实现这一点。我喜欢它的外观。像往常一样,任何有棱角的东西,我都需要几个小时才能弄清楚到底发生了什么(还有谷歌搜索我以前没见过的东西——看看你的$implicit
,但乍一看它看起来不错!谢谢。不客气。我会用评论解释一些小细节。@GaryMcGill补充了一些解释。让我困惑的一件事是需要AppCellBodyTemplate指令,它似乎做得很少。我想知道为什么这是必要的,并尝试在没有它的情况下重新制作您的示例。请参阅。它似乎有效-您认为我使用这种方法会失去任何功能吗?将来,您将需要另一个模板来自定义标题(我自己开发了一个表组件)。当您确实需要时,您必须选择具有不同查询的不同模板。在此之前,您的模板似乎还可以。
<app-cell class="foo">
<td>
<div>...</div>
</td>
</app-cell>
carData = [{
model: 'Mercedes',
year: 2015,
km: 10000
}, {
model: 'Audi',
year: 2016,
km: 5000
}];