我正在尝试创建一个通用的幻灯片显示组件,该组件将包含多个组件,然后将根据某些用户操作循环遍历。
它与Angular Material的stepper component非常相似。
到目前为止,我发现您可以使用@ContentChildren
来获取对多个(传入的)组件/内容的引用,但是我不确定如何实际呈现这些组件。
这是我创建的一个示例:https://stackblitz.com/edit/angular-yjfbwb
app.component.html文件包含一个<tours></tours>
标记,只要您用#tour
对其进行标记,就可以传递任何想要的标记。在tours.component.ts内部,您将看到我只是在遍历传入的组件。
但是我该如何渲染它们呢?
我已经在Google周围搜索了,看来这不是我的方式吗?但是,也许我搜索不正确。理想情况下,对于我的团队,我想使此游览组件尽可能简单易用(基本上在上面的示例中如此)。
任何帮助将不胜感激!
答案 0 :(得分:1)
有很多方法可以做到这一点。
这是一个简单的解决方案。只是想知道。您可能要根据自己的具体问题采取不同的操作。
对于要在游览组件中投影的每个元素,必须创建一个模板。您可以通过StructuralDirective
来做到这一点。
import {Directive, TemplateRef, Input} from '@angular/core';
@Directive({
selector: '[appTour]'
})
export class TourDirective {
@Input('appTour') id: number;
constructor(public template: TemplateRef<any>) {
}
}
用指令标记ToursComponent
中的元素(不要忘记星号):
<tours>
<p *appTour="123">hello</p>
<p *appTour="1234">world</p>
</tours>
要确定指令,您可以将导览的id
传递给模板。
现在,在ToursComponent
内通过TourDirective
注入@ContentChildren
并在ViewContainerRef | <ng-container>
内传递要渲染的模板
import { Component, ContentChildren, QueryList } from '@angular/core';
import { TourDirective } from './tour.directive';
@Component({
selector: 'tours',
template: `
<ng-container *ngFor="let tour of tours.toArray()">
<ng-container *ngIf="tour.id === tourToDisplay">
<ng-container [ngTemplateOutlet]="tour.template"></ng-container>
</ng-container>
</ng-container>`,
})
export class ToursComponent {
public tourToDisplay = 123;
@ContentChildren(TourDirective) tours: QueryList<TourDirective>;
}