angular - 以 ng-content 作为正文重复 ng-template(创建 ng-content 的副本)
问题描述
我正在创建一个将自定义列添加到 PrimeNg 表的选项。我想创建它的原因是因为我提供了一个默认表,其中已经设置了很多配置选项。
我遇到的问题是我似乎无法ng-template
多次重复一个组件。
我的版本
- 角
7.2.12
- 普瑞蒙
7.1.0
- @角/动画
7.2.12
我想达到什么
我想创建一个包装器来简化列的创建并消除在表体内创建多个模板的需要。
示例我要简化的内容:
<table>
<!-- Row 1 -->
<ng-template #header><th>edit></th></ng-template>
<ng-template #content><button>edit></button></ng-template>
<!-- Row 2 -->
<ng-template #header><th>delete></th></ng-template>
<ng-template #content><button>delete></button></ng-template>
</table>
我想将其简化为:
<table>
<!-- Row 1 -->
<custom-column>
<th header>edit></th>
<button>edit></button>
</custom-column>
<!-- Row 2 -->
<custom-column>
<th header>delete></th>
<button>delete></button>
</custom-column>
</table>
我几乎已经在这个StackBlitz中完成了这个工作
问题
我现在面临的问题是我需要为表格中的每一行重复内容模板,以便每一行都有一个编辑和一个删除按钮。但是通过这种设置,按钮只显示在最后一行(我认为这是因为ng-content
只有一次嵌入?)。
是否有可能我想要实现的目标,如果是这样,我应该如何更改我的代码?
解决方案
由于该ng-content
组件不支持多次投影相同的内容(此处和此处),我需要切换到将模板注入到表格组件中。
受到 Primeng 解决此问题的方式的启发(通过创建包含模板的指令):
@Directive({ selector: '[pTemplate]' })
export class PrimeTemplate {
@Input() type: string;
@Input('pTemplate') name: string;
constructor(public template: TemplateRef<any>) { }
getType(): string {
return this.name;
}
}
用法:<ng-template pTemplate="header"></ng-template
他们正在创建一个模板并在表格组件中获取对该模板的引用。模板可以无限次重复使用,从而解决投影问题。
因为我想保持灵活性,但想避免使用字符串比较(注意 'name' 属性)和需要从中提取正确的模板,querylist
我最终创建了 2 个指令,可以按如下方式使用(那种与我第一次尝试的示例相同,但实现更好):
<ng-container>
<ng-template appColHeader>Delete</ng-template>
<ng-template appColContent><button>Not here!</button></ng-template>
</ng-container>
可以找到此代码的完整实现是这个StackBlitz。
推荐阅读
- flutter - Flutter 使用 Listview.builder 和提供者
- cmake - 如何定义目标以包含存储在单个目录中的多个库
- haskell - 具有语法糖和模式匹配的非详尽模式
- c# - C# 调用非托管 DLL:在 DLL 中引发 Bad_allocation 异常
- django - django-select2 基于类或基于函数的视图
- ssh - 为什么 SSH 中的代码执行仅在会话启动后才有效
- database - 数据保护配置错误:ORA-16778:一个或多个成员的重做传输错误
- javascript - 将过滤后的常量放入选择框javascript
- xslt-1.0 - XSLT 1.0 for-each 'starts-with'(长度可变)
- java - 在字符串中查找特定字母 - 不工作(Java)