gpt4 book ai didi

angular - 具有多种内容类型的 ContentChildren

转载 作者:太空狗 更新时间:2023-10-29 18:24:12 25 4
gpt4 key购买 nike

您好,我目前正在构建一个表,该表将允许其中包含多种列类型。我希望能够像这样使用它:

<my-table [rows]="rows">
<text-column [someParameters]="here" header="text"></text-column>
<icon-column [someParameters]="here" header="icon"></icon-column>
</my-table>

text-columnicon-column是单独的指令。

我目前有一个名为 column 的抽象类让我们说 text-columnicon-column可能看起来像:

   export abstract class Column
{
@Input() someParameters:string;
@Input() header:string;
}

export class TextColumnDirective extends Column
{
//I do cool stuff here
}

export class IconColumnDirective extends Column
{
//I do different cool stuff
}

我的表格可能看起来像:

@Component({
selector:'my-table',
template: `
<table>
<thead>
<tr>
<th *ngFor="let column of columns">{{column.header}}</th>
</tr>
</thead>
</table>
`
})
export class MyTableComponent
{
@ContentChildren(Column) columns:QueryList<any>;

//I do cool stuff too
}

因此,如果我不使用摘要并仅使用像 @ContentChildren(TextColumnDirective) columns:QueryList<any>; 这样的文本列来调用它,那么这种方法就有效了但只获取文本列,与图标列相同。我如何才能完成此操作,以便稍后为不同的 columnType 添加不同类型的指令?

最佳答案

@3xGuy 的答案是正确的,但是 forwardRef(() => {}) 不是必需的,除非提供的类型是在装饰器或装饰类之后定义的 see this Angular In Depth post

注意这个方法可以用于ContentChildren或者ViewChildren,下面我使用ViewChildren

item.ts

import { Directive } from '@angular/core';

export class Item {
color = '';
}

@Directive({
selector: '[blueItem]',
providers: [{ provide: Item, useExisting: BlueItemDirective }],
})
export class BlueItemDirective { // 'extends Item' is optional
color = 'blue';
}

@Directive({
selector: '[redItem]',
providers: [{ provide: Item, useExisting: RedItemDirective }],
})
export class RedItemDirective { // 'extends Item' is optional
color = 'red';
}

app.component.ts

import { Component, ViewChildren, QueryList } from '@angular/core';

import { Item } from './item';

@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: [ './app.component.css' ]
})
export class AppComponent {
name = 'Multiple View Child Types';

// Note we query for 'Item' here and not `RedItemDirective'
// or 'BlueItemDirective' but this query selects both types
@ViewChildren(Item) viewItems: QueryList<Item>;

itemColors: string[] = [];

ngAfterViewInit() {
this.itemColors = this.viewItems.map(item => item.color);
}
}

app.component.html

<div redItem>Item</div>
<div blueItem>Item</div>
<div blueItem>Item</div>
<div blueItem>Item</div>
<div redItem>Item</div>

<h2>Colors of the above directives</h2>
<ul>
<li *ngFor="let color of itemColors">{{color}}</li>
</ul>

这是一个StackBlitz展示这种行为。

关于angular - 具有多种内容类型的 ContentChildren,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49278479/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com