【发布时间】:2020-08-14 02:39:42
【问题描述】:
我知道还有其他想法,但我想以下面定义的方式使用ng-template、ng-content 和@ContenChild() 装饰器。
这种想法是通过看到角材料组件的实际实现而产生的。
在这里,我有两个组件:
- 容器组件(app-container)
- 子组件(app-child)
我想把app-child组件的内容直接显示在app-container中。
我在这里有一些相关的解决方案:https://stackblitz.com/edit/ngtemplateoutlet-and-content-projection?file=src%2Fapp%2Fapp.component.html。但这并不能完全满足我的要求。
下面的html是需要的,主要在app.component.html:
<app-container>
<app-nav>
<a routerLink="/home">Home</a>
<a routerLink="/about">About</a>
</app-nav>
<app-main>
<p>This is the content to be reflect.</p>
</app-main>
</app-container>
应该产生这样的输出:
<div class="container">
<nav role="navigation" class="navigation">
<a routerLink="/home">Home</a>
<a routerLink="/about">About</a>
</nav>
<section role="main" class="main__content">
<p>This is the content to be reflect.</p>
</section>
</div>
我的代码是这样的
import { Component, ContentChild, AfterContentInit } from '@angular/core';
@Component({
selector: 'app-main'
template: `<ng-template><ng-content></ng-content></ng-template>`
})
export class AppMain {
}
@Component({
selector: 'app-nav'
template: `<ng-template><ng-content></ng-content></ng-template>`
})
export class AppNav {
}
@Component({
selector: 'app-container',
template: `
<div class="container">
<nav role="navigation" class="navigation">
<ng-container [ngTemplateOutlet="nav"></ng-container>
</nav>
<section role="main" class="main__content">
<ng-container [ngTemplateOutlet]="main"></ng-container>
</section>
</div>
`
})
export class AppContainer implements AfterContentInit {
@ContentChild(AppMain) main: AppMain;
@ContentChild(AppNav) nav: AppNav;
ngAfterContentInit() {
console.log(this.main);
console.log(this.nav);
}
}
【问题讨论】:
-
在
app-container中不使用可选ng-content而不是ng-container[ngTemplateOutlet]的任何具体原因?我认为它更直观……但当然也可以只是口味问题。
标签: angular ng-template ng-content