多个 ng-content
Multiple ng-content
我正在尝试使用 Angular 6 中的多个 ng-content
构建自定义组件,但这不起作用,我不知道为什么。
这是我的组件代码:
<div class="header-css-class">
<ng-content select="#header"></ng-content>
</div>
<div class="body-css-class">
<ng-content select="#body"></ng-content>
</div>
我正在尝试在另一个地方使用这个组件,并在 ng-content
的 body
和 header select
中呈现两个不同的 HTML 代码,有些东西像这样:
<div #header>This should be rendered in header selection of ng-content</div>
<div #body>This should be rendered in body selection of ng-content</div>
但是组件呈现空白。
你们知道我可能做错了什么或者在同一组件中呈现两个不同部分的最佳方法是什么吗?
谢谢!
- 您可以添加虚拟属性
header
和 body
而不是模板引用 (#header, #body)
.
- 并使用
ng-content
和 select
属性进行嵌入,例如 select="[header]"
。
app.comp.html
<app-child>
<div header >This should be rendered in header selection of ng-content</div>
<div body >This should be rendered in body selection of ng-content</div>
</app-child>
child.comp.html
<div class="header-css-class">
<ng-content select="[header]"></ng-content>
</div>
<div class="body-css-class">
<ng-content select="[body]"></ng-content>
</div>
或者您可以使用:
app.comp.html
<app-child>
<div role="header">This should be rendered in header selection of ng-content</div>
<div role="body">This should be rendered in body selection of ng-content</div>
</app-child>
child.comp.html
<div class="header-css-class">
<ng-content select="div[role=header]"></ng-content>
</div>
<div class="body-css-class">
<ng-content select="div[role=body]"></ng-content>
</div>
符合 Web Component 规格。即使那是 Angular。这是关于避免选择器的属性,如 Angular 指令或其他用途的保留属性。所以,我们只使用 "slot" 属性。我们会看到 <ng-content select="[slot=foobar]">
为 <slot name="foobar">
。
示例:
你好-world.component.html
<ng-content select="[slot=start]"></ng-content>
<span>Hello World</span>
<ng-content select="[slot=end]"></ng-content>
app.component.html
<app-hello-world>
<span slot="start">This is a </span>
<span slot="end"> example.</span>
</app-hello-world>
结果
This is a Hello World example.
Stackblitz Example
您可以使用任何您想要的名称,例如 "banana" 或 "fish"。但是 "start" 和 "end" 是在前后放置元素的良好约定。
补充其他答案:
您也可以使用自定义标签(例如 <ion-card>
、<ion-card-header>
和 <ion-card-content>
)。
app.comp.html
<app-child>
<app-child-header>This should be rendered in header selection of ng-content</app-child-header>
<app-child-content>This should be rendered in content selection of ng-content</app-child-content>
</app-child>
child.comp.html
<div class="header-css-class">
<ng-content select="app-child-header"></ng-content>
</div>
<div class="content-css-class">
<ng-content select="app-child-content"></ng-content>
</div>
您会收到一条警告消息,但它会起作用。
您可以禁止显示警告消息或使用已知标签,例如header
或footer
。
但是,如果您不喜欢这些方法中的任何一种,您应该使用其他解决方案之一。
作为另一种选择,您可以将模板传递给子组件,然后您将受益于能够将值绑定到内容/模板
父组件html
<app-child
[templateHeader]="header"
[templateContent]="content">
</app-child>
<ng-template #header
let-data="data"> < -- how you get dynamic data
what ever you would like the header to say
{{data}}
</ng-template>
<ng-template #content>
what ever you would like the content to say or any other component
</ng-template>
子组件 ts
export class ChildComponent {
@Input() templateHeader: TemplateRef<any>;
@Input() templateContent: TemplateRef<any>;
}
子组件html
<div class="header-css-class">
<ng-container
*ngTemplateOutlet="
templateHeader;
context: { , < -- if you want to pass data to your template
data: data
}">
</ng-container>
</div>
<div class="content-css-class">
<ng-container *ngTemplateOutlet="templateContent">
</ng-container>
</div>
有关模板的更完整说明,请参阅这篇精彩文章 https://indepth.dev/posts/1405/ngtemplateoutlet
如果您只想“接受”多个组件,您可以使用:
<ng-content select="custom-component,a"></ng-content>
这接受自定义组件的元素以及锚点 (a) 元素并且不改变顺序。
我正在尝试使用 Angular 6 中的多个 ng-content
构建自定义组件,但这不起作用,我不知道为什么。
这是我的组件代码:
<div class="header-css-class">
<ng-content select="#header"></ng-content>
</div>
<div class="body-css-class">
<ng-content select="#body"></ng-content>
</div>
我正在尝试在另一个地方使用这个组件,并在 ng-content
的 body
和 header select
中呈现两个不同的 HTML 代码,有些东西像这样:
<div #header>This should be rendered in header selection of ng-content</div>
<div #body>This should be rendered in body selection of ng-content</div>
但是组件呈现空白。
你们知道我可能做错了什么或者在同一组件中呈现两个不同部分的最佳方法是什么吗?
谢谢!
- 您可以添加虚拟属性
header
和body
而不是模板引用(#header, #body)
. - 并使用
ng-content
和select
属性进行嵌入,例如select="[header]"
。
app.comp.html
<app-child>
<div header >This should be rendered in header selection of ng-content</div>
<div body >This should be rendered in body selection of ng-content</div>
</app-child>
child.comp.html
<div class="header-css-class">
<ng-content select="[header]"></ng-content>
</div>
<div class="body-css-class">
<ng-content select="[body]"></ng-content>
</div>
或者您可以使用:
app.comp.html
<app-child>
<div role="header">This should be rendered in header selection of ng-content</div>
<div role="body">This should be rendered in body selection of ng-content</div>
</app-child>
child.comp.html
<div class="header-css-class">
<ng-content select="div[role=header]"></ng-content>
</div>
<div class="body-css-class">
<ng-content select="div[role=body]"></ng-content>
</div>
符合 Web Component 规格。即使那是 Angular。这是关于避免选择器的属性,如 Angular 指令或其他用途的保留属性。所以,我们只使用 "slot" 属性。我们会看到 <ng-content select="[slot=foobar]">
为 <slot name="foobar">
。
示例:
你好-world.component.html
<ng-content select="[slot=start]"></ng-content>
<span>Hello World</span>
<ng-content select="[slot=end]"></ng-content>
app.component.html
<app-hello-world>
<span slot="start">This is a </span>
<span slot="end"> example.</span>
</app-hello-world>
结果
This is a Hello World example.
Stackblitz Example
您可以使用任何您想要的名称,例如 "banana" 或 "fish"。但是 "start" 和 "end" 是在前后放置元素的良好约定。
补充其他答案:
您也可以使用自定义标签(例如 <ion-card>
、<ion-card-header>
和 <ion-card-content>
)。
app.comp.html
<app-child>
<app-child-header>This should be rendered in header selection of ng-content</app-child-header>
<app-child-content>This should be rendered in content selection of ng-content</app-child-content>
</app-child>
child.comp.html
<div class="header-css-class">
<ng-content select="app-child-header"></ng-content>
</div>
<div class="content-css-class">
<ng-content select="app-child-content"></ng-content>
</div>
您会收到一条警告消息,但它会起作用。
您可以禁止显示警告消息或使用已知标签,例如header
或footer
。
但是,如果您不喜欢这些方法中的任何一种,您应该使用其他解决方案之一。
作为另一种选择,您可以将模板传递给子组件,然后您将受益于能够将值绑定到内容/模板
父组件html
<app-child
[templateHeader]="header"
[templateContent]="content">
</app-child>
<ng-template #header
let-data="data"> < -- how you get dynamic data
what ever you would like the header to say
{{data}}
</ng-template>
<ng-template #content>
what ever you would like the content to say or any other component
</ng-template>
子组件 ts
export class ChildComponent {
@Input() templateHeader: TemplateRef<any>;
@Input() templateContent: TemplateRef<any>;
}
子组件html
<div class="header-css-class">
<ng-container
*ngTemplateOutlet="
templateHeader;
context: { , < -- if you want to pass data to your template
data: data
}">
</ng-container>
</div>
<div class="content-css-class">
<ng-container *ngTemplateOutlet="templateContent">
</ng-container>
</div>
有关模板的更完整说明,请参阅这篇精彩文章 https://indepth.dev/posts/1405/ngtemplateoutlet
如果您只想“接受”多个组件,您可以使用:
<ng-content select="custom-component,a"></ng-content>
这接受自定义组件的元素以及锚点 (a) 元素并且不改变顺序。