【发布时间】:2020-09-12 00:24:28
【问题描述】:
我有一个 ButtonGroupComponent,我需要在其中渲染两种类型的子项:ButtonActionComponent 或 ButtonNavigationComponent。
我需要通过@ContentChildren 投射这些孩子,但我能做什么,因为不可能 通过两个选择器?
@ContentChildren(??)
public children: QueryList<??>;
所以,我尝试了另一种解决方案:我创建了一个组件,GroupableButtonComponent,它由两个(ButtonActionComponent 和ButtonNavigationComponent)扩展。
然后我直接将这个组件传递给 ContentChildren:
@ContentChildren(GroupableButtonComponent)
public children: QueryList<GroupableButtonComponent>;
但我发现孩子们仍然空虚。
我尝试的另一个解决方案是利用依赖注入并创建一个 GroupableButton 类:
export class GroupableButton {
}
其中ButtonActionComponent:
@Component({
selector: "button-action",
template: `
...
`,
providers: [{ provide: GroupableButton, useClass: ButtonActionComponent }],
})
export class ButtonActionComponent {
...
}
和ButtonNavigationComponent:
@Component({
selector: "button-navigation",
template: `
...
`,
providers: [{ provide: GroupableButton, useClass: ButtonNavigationComponent }],
})
export class ButtonNavigationComponent {
...
}
我是这样用的:
@ContentChildren(GroupableButton)
public children: QueryList<GroupableButton>;
但是因为在我的 ButtonGroupComponent 里面我有:
...
this.children
.toArray()
.slice(0, visibleButtons)
.reverse()
.forEach((button) => {
const factory = this.factoryResolver.resolveComponentFactory(
GroupableButton
);
const component = this.visibleButtonsContainer.createComponent(
factory,
0,
null,
[[button.element.nativeElement]]
);
this.clonePropertiesFrom(button, component.instance);
this.buttons.push(component);
});
...
这一次的问题是我不能将 GroupableButton 作为我的模块中的 entryComponents 传递。
【问题讨论】:
-
你 100% 过分复杂化了。你能退后一步,在这里谈谈你的实际目标吗
标签: angular typescript