html - 将 ng-content 模板化为数据列表的操作
问题描述
我的组件呈现一个数据列表。如果将数据列表作为操作,它们将是组件内容的一部分:
<my-component>
<a (click)="eventA($event)">[Hi]</a>
<a (click)="eventB($event)">[Hello]</a>
</my-component>
我的想法是将项目作为我的数据列表每一行的模板:
Name | Date | Actions
Foo | 1/1/21 | [Hi] [Hello]
Foo | 1/1/21 | [Hi] [Hello]
Foo | 1/1/21 | [Hi] [Hello]
我最初通过执行以下操作解决了这个问题:
<my-component [columns]="columns" [data]="data" [actions]="true">
<div *appTransclude>
<a> ....</a>
</div>
</my-component>
在我的组件中说:
<ng-container ngTemplateOutlet="transcludeTemplate;context:{$implicit: element}"></ng-container>
其中元素是行。数据。
@ContentChild(TranscludeDirective, {read: TemplateRef, static: true}) transcludeTemplate;
这很好用。它消除了我需要的一切,并且运行良好,但不是很好。我想多看一下内容,而不是使用 Wrapper div,我希望将 *appTransclude 添加到每个 Anchor 标记中。然后我可以做一些更好的事情,例如:如果超过 3 个,变成一个选择或下拉菜单以节省空间。
是否有更好的方法通过模板化 ng-content 并执行一些处理来完成此任务?为了不让用户感到困惑,我确实计划创建一个带有事件、标签和图标的动作组件,但我试图思考如何更好地处理这一切。
你有什么建议?我真正想到的唯一一件事就是根本不使用内容,而是以编程方式定义它并传入:
@Input() actions:{label:string, event:any, icon: string}[] = []
//---
<ng-template #actiontemplate>
<a *ngFor="let action of actions" [matTooltip]="action.label" (click)="action.event($event)"><i class="{{action.icon}}"></i></a>
</ng-template>
<ng-container *ngTemplateOutlet="actiontemplate;context:{$implicit: element}"></ng-container>
解决方案
推荐阅读
- visual-c++ - 为什么 DECLARE_MESSAGE_MAP 受保护但消息处理程序是公开的?
- mysql - 从具有不同ID的同一个表中获取多个数据
- android - 不能再用 Mockito 模拟最后一堂课了
- python - 使用 Pandas 根据 Condition 将两行数据合二为一
- sql - 如何提高这个 SQL 的速度?
- python - 使用 pandas 将相关列重新定位到表的末尾
- vue.js - 如何将道具传递给vue中的子组件
- r - 是否有用于制作适合报告的描述性表格的 R 包和功能?
- reactjs - 反应原生 | ReferenceError: defaultStyles 未定义
- azure - Ansible 循环使用图形 api 在 Azure AD 组中添加成员