angular - 具有通用组件的角度列表作为列表项
问题描述
假设我有一个“ParentComponent”,它有一个项目列表(假设作为输入)并且需要呈现列表中的元素。我需要这个父组件是可重用的,但是它支持的自定义之一是选择它用于呈现列表项的模板(或组件)。用于子列表项的组件可以是任何东西,只要它可以将提供给它的列表项呈现为输入(模板可以正确引用项的属性)。这在诸如 React 之类的框架中是可能的,所以我的问题是在 Angular 中是否也可能,以及如何做到这一点?
我想象父组件将自定义组件作为输入,以及项目
@Input()
items: Array<ItemType>;
@Input()
componentForRenderingStuff: ?;
模板是这样的
<div class="wrapper">
<!-- ...stuff -->
<div class="list-item" *ngFor="let i of items">
<component-for-rendering-stuff [item]="i"></component-for-rendering-stuff>
</div>
</div>
这意味着在另一个模板中使用父组件就像
<app-parent-component [items]="items" [componentForRenderingStuff]="SomeComponent"></app-parent-component>
这样的事情可能吗?我看了看,ng-content
但我无法使它与*ngFor
.
解决方案
正如爱德华在他的评论中建议的那样,可以使用动态组件加载来实现行为。
我在 npm 上找到了一些第三方库,它们解决了这个问题,由于时间和简单性,我使用了具有最吸引人的用户统计数据的库:https ://www.npmjs.com/package/ng-dynamic-component
简而言之,通用列表组件看起来像这样
@Component({
selector: 'app-list',
template: `
<div *ngFor="let item of items">
<ndc-dynamic
[ndcDynamicComponent]="listItemComponent"
[ndcDynamicInputs]="{ input: item.data }"
></ndc-dynamic>
</div>
`,
styleUrls: ['...'],
})
export class ClickableVerticalListComponent {
@Input()
listItemComponent: any;
@Input()
items: Array<any>;
constructor() {}
}
如果我们想为列表项使用带有特定自定义组件的列表,我们可以这样做:
@Component({
selector: '...',
template: `
<app-list
[items]="items"
[listItemComponent]="ExampleComponent"
></app-list>
`,
styleUrls: ['...'],
})
export class ParentComponent {
ExampleComponent = ExampleComponent;
items: [{ data: ... }, { data: ... }];
constructor() {}
}
推荐阅读
- salt - 错误:需要数据和盐参数,路由未达到验证
- c# - 忽略 ASP.NET Core 3.1 中的 WCF 证书错误
- selenium-webdriver - 无法使用 Selenium 中的 Actions 类执行鼠标悬停
- azure - ClientSecretCredential 身份验证失败:配置问题阻止身份验证 - 检查来自服务器的错误消息以获取详细信息
- android - 是否有通过 Gmail 发送 HTML 内容的更新方式?
- react-native - React Native,Android,底部的警告控制台出现在导航下
- docker - 如何在 Alpine 上安装 xinetd 或 openbsd-inetd
- spring-boot - 如果我将 pollTimeout 设置为 1000 毫秒,Kafka Consumer 中会收到多少条消息
- ruby - Ruby - 将 ldap objectGUID 转换为可读形式
- javascript - 在 Android 上的 Flutter webview 中启用位置