我正在构建一个自定义的模态组件(我想要一些简单的东西),但是发现了我无法理解的这种行为。
这是我的模式组件HTML
<div class="modal-overlay">
<div class="modal-main">
<ng-content selector="header"></ng-content>
<ng-content></ng-content>
<ng-content selector="footer"></ng-content>
</div>
</div>
如果我使用此组件模板,则一切正常,以后我可以像这样使用该组件,并且可以按预期工作。
<app-modal>
<header><h1>Hello modal!</h1></header>
<div class="modal-content">This is a modal that will be printed nicely</div>
<footer><button>Close</button></footer>
</app-modal>
当我尝试将ng-content
之一封装在div中时,问题就来了。
如果我这样做
<div class="modal-overlay">
<div class="modal-main">
<div class="is-flex">
<ng-content selector="header"></ng-content>
<i class="fas fa-times"></i>
</div>
<ng-content></ng-content>
<ng-content selector="footer"></ng-content>
</div>
</div>
结果将是以下HTML。
<div _ngcontent-c1="" class="modal-overlay">
<div _ngcontent-c1="" class="modal-main">
<div _ngcontent-c1="" class="is-flex">
<i class="fas fa-times"></i>
</div>
<header><h1>Hello modal!</h1></header>
<div class="modal-content">This is a modal that will be printed nicely</div>
<footer><button>Close</button></footer>
</div>
</div>
有人知道为什么header
不在.is-flex
div内吗?
谢谢!
答案 0 :(得分:0)
ng-content不会“产生”内容,它只是投影现有内容 内容。可以将其视为node.appendChild(el)或 著名的JQuery版本$(node).append(el):使用这些方法, 没有克隆节点,只需将其移动到新位置即可。因为 这将投影内容的生命周期绑定到它所在的位置 声明,而不是显示。
使用ng-template
<app-modal>
<ng-template> <header><h1>Hello modal!
</h1></header></ng-template>
<div class="modal-content">This is a modal that will be printed nicely</div>
<footer><button>Close</button></footer>
</app-modal>
,因为它收到了模板。它需要使用@ContentChild访问模板,并使用ngTemplateOutlet进行显示
<div class="modal-overlay">
<div class="modal-main">
<div class="is-flex">
<ng-container
[ngTemplateOutlet]="template">
</ng-container>
<i class="fas fa-times">
</i>
</div>
<ng-content></ng-content>
<ng-content selector="footer">
</ng-content>
</div>
</div>
@ContentChild(TemplateRef) template: TemplateRef
有关更多信息:https://medium.com/claritydesignsystem/ng-content-the-hidden-docs-96a29d70d11b