我尝试使用ng-content
选择性地显示特定区域中的某些组件,但我没有让过滤正常工作。
我有一个布局组件,其中包含某些组件,这些组件标记有需要渲染的指令。
<standard-layout class="blah">
<sample-navigation *navBarItem></sample-navigation>
<sample-navigation *navBarItem></sample-navigation>
<sample-form-1 *contentItem></sample-form-1>
<sample-form-2 *contentItem></sample-form-2>
<sample-form-3 *contentItem></sample-form-3>
<sample-navigation *actionBarItem></sample-navigation>
<sample-navigation *actionBarItem></sample-navigation>
</standard-layout>
这是我的contentItem
指令:
@Directive(selector: '[contentItem]')
class ContentItemDirective implements AfterContentInit {
final ViewContainerRef vcRef;
final TemplateRef template;
final ComponentResolver componentResolver;
ContentItemDirective(this.vcRef, this.template, this.componentResolver);
ComponentRef componentRef;
@override
ngAfterContentInit() async {
final componentFactory =
await componentResolver.resolveComponent(ContentItem);
componentRef = vcRef.createComponent(componentFactory);
(componentRef.instance as ContentItem)
..template = template;
}
}
这就是我ContentItem
的样子
@Component(
selector: "content-item",
host: const {
'[class.content-item]': true,
},
template: """
<template [ngTemplateOutlet]="template"></template>
""",
directives: const [NgTemplateOutlet]
)
class ContentItem {
TemplateRef template;
}
在standard-layout
模板中,当我执行<ng-content select=""></ng-content>
时,它会按预期显示所有组件。
当我尝试过滤组件时,它似乎不起作用:
CSS过滤不显示任何内容:
<ng-content select=".content-item"></ng-content>
过滤content-item
标签本身也不显示任何内容:
<ng-content select="[content-item]"></ng-content>
我尝试了select=...
的许多排列,但似乎无法让它发挥作用。有什么想法吗?
我在使用Angular Dart 3.0.0软件包。
答案 0 :(得分:0)
使用@ContentChildren
在我的StandardLayout
组件中,我使用以下方法过滤输入:
@ContentChildren(ContentItemDirective)
QueryList<ContentItemDirective> contentItems;
@ContentChildren(ActionBarItemDirective)
QueryList<ActionBarItemDirective> actionBarItems;
@ContentChildren(NavBarItemDirective)
QueryList<NavBarItemDirective> navBarItems;
现在在standard-layout
模板中,可以循环浏览项目并使用ngTemplateOutlet
显示模板
<nav class="nav1" #nav1>
<div *ngFor="let item of navBarItems">
<template [ngTemplateOutlet]="item.template"></template>
</div>
</nav>
<div class="content" #content>
<div *ngFor="let item of contentItems">
<template [ngTemplateOutlet]="item.template"></template>
</div>
</div>
<nav class="nav2" #nav2>
<div *ngFor="let item of actionBarItems">
<template [ngTemplateOutlet]="item.template"></template>
</div>
</nav>