我正在使用Angular创建标签控件。结果应如下所示:
<tabs>
<tab header="tab 1">
hello
</tab>
<tab header="tab 2">
world
</tab>
</tabs>
现在,标签组件如下所示:
@Component({
selector: 'tab',
template: `<ng-content></ng-content>`
})
export class TabComponent {
@Input() header: string;
}
标签组件如下所示:
@Component({
selector: 'tabs',
template: `
<div class="tabs">
<ul>
<li *ngFor="let tab of tabs">
<a (click)="selectTab(tab)">
{{tab.header}}
</a>
</li>
</ul>
</div>
`,
})
export class TabsComponent {
@ContentChildren(TabComponent) tabs;
selectTab(tab: TabComponent) {
}
}
现在,当调用selectTab()方法时,我希望在模板的底部呈现按下的选项卡的内容(&#34; hello&#34;或&#34; world&#34;)
基本上, TabsComponent 中需要某种标签占位符,并且需要将其绑定到当前选定的 TabComponent 。
无论如何,我无法让它发挥作用。我尝试过使用 ng-template 和 createEmbeddedView ,但我不了解如何从组件中获取TemplateRef,而且我还是不完全确定这是正确的方法。
非常感谢!
答案 0 :(得分:0)
好吧,所以我解决了,但我不确定这是正确的解决方案。 我重复我的需求: 我想创建一个功能齐全的选项卡集组件,它由选项卡标题和当前选定的选项卡组成。
所以这是我的解决方案。请随意建议一个更好的,因为我不完全确定这是标签集组件的示例:
@Directive({
selector: 'tab',
})
export class TabDirective {
private static seed = 0;
readonly id: number;
@Input() header: string;
@HostBinding('hidden') isHidden: boolean;
private isActive: boolean;
@HostBinding('class.active') set active(value: boolean) {
this.isActive = value;
this.isHidden = !this.isActive;
}
get active(): boolean {
return this.isActive;
}
constructor() {
this.id = TabDirective.seed++;
this.active = false;
}
}
@Component({
selector: 'bu-tabs',
template: `
<div class="tabs">
<ul>
<li *ngFor="let tab of tabs" [class.is-active]="tab.active">
<a (click)="selectTab(tab)">
<span>{{tab.header}}</span>
</a>
</li>
</ul>
</div>
<ng-content></ng-content>
`,
})
export class TabsComponent implements AfterViewInit {
@ContentChildren(TabDirective) tabs: QueryList<TabDirective>;
@Output() select = new EventEmitter<TabDirective>();
private selectedTab: TabDirective;
selectTab(tab: TabDirective) {
this.tabs.forEach((t: TabDirective) => t.active = (t.id === tab.id));
this.selectedTab = tab;
}
ngAfterViewInit(): void {
if (this.tabs && this.tabs.length > 0) {
this.tabs.first.active = true;
}
}
}
@Component({
template: `
<tabs>
<bu-tab header="hello">
Hello!!
</bu-tab>
<bu-tab header="world">
World!!
</bu-tab>
</tabs>
`,
})
export class App { }