Angular2 子组件作为数据 [英] Angular2 child component as data
问题描述
假设我有两个组件:parent
和 child
.HTML 将如下所示:
Let's say I have two components: parent
and child
. The HTML would look like this:
<parent title="Welcome">
<child name="Chris">Blue Team</child>
<child name="Tom">Red Team</child>
</parent>
最终输出如下:
<h1>Welcome</h2>
<ul>
<li><b>Chris</b> is on the Blue Team</li>
<li><b>Tom</b> is on the Red Team</li>
</ul>
父组件:
@Component({
selector: 'parent',
directives: [ChildComponent], // needed?
template: `
<h1>{{title}}</h1>
<ul>
<li *ngFor="#child of children()">{{child.content}}<li>
</ul>`
})
export class ParentComponent {
@Input() title;
children() {
// how?
}
}
如何从父组件访问子组件并获取它们的内容?
How do I access the child components from within the parent and get their content?
另外,我不希望孩子被自动渲染.根据某些情况,我可能会选择不给某些孩子看.
Also, I don't want the children to be automatically rendered. Depending on some conditions I may choose not to show certain children.
谢谢.
推荐答案
要将内容投影到元素(嵌入),您需要 <ng-content>
元素,如
For projecting content to an element (transclusion) you would need the <ng-content>
element like
@Component({
selector: 'parent',
directives: [ChildComponent], // needed?
template: `
<h1>{{title}}</h1>
<ul>
<li *ngFor="letchild of children()">
<ng-content></ng-content>
</li>
</ul>`
})
但这不适用于您的用例,因为 <ng-content>
不生成内容,它只投影它(用作占位符,其中子项显示在您的组件模板中.
but that won't work for your use case because <ng-content>
doesn't produce content, it only projects it (works as a placehoder where children are displayed within your components template.
即使 *ngFor
会产生 3 个
元素,子元素也只会在第一个
元素.
Even though *ngFor
would produce 3 <ng-content>
elements, the children would only be displayed once in the first <ng-content>
element.
允许使用像
<ng-content select="[name=Chris]"></ng-content>
模板如
<ul>
<li>
<ng-content select="[name=Chris]"></ng-content>
</li>
</ul>`
会导致
<h1>Welcome</h2>
<ul>
<li><b>Chris</b> is on the Blue Team</li>
</ul>
绑定中解释的更灵活和强大的方法在 Angular 2 中使用 ngForTemplate 时的事件(来自 @kemsky 的评论)
A more flexible and powerful approach explained in Binding events when using a ngForTemplate in Angular 2 (from @kemsky s comment)
、
@ViewChildren()
和 *ngForTemplate
<template>
, @ViewChildren()
, and *ngForTemplate
如果你用 标签包裹子元素,你可以使用
@ContentChildren()
访问它们并使用 *ngFor
插入它们和 *ngForTemplate
.
If you wrap the children in <template>
tags you can access them using @ContentChildren()
and insert them using *ngFor
and *ngForTemplate
.
我在这里对内部的 *ngFor
使用了一些小技巧.有一个更好的方法正在进行中(ngTemplateOutlet
https://github.com/angular/angular/pull/8021 已经合并)
I am using a little hack here with the inner *ngFor
. There is a better approach work in progress (ngTemplateOutlet
https://github.com/angular/angular/pull/8021 already merged)
@Component({
selector: 'parent',
template: `
<h1>{{title}}</h1>
<ul>
<li *ngFor="let child of templates">
<!-- with [child] we make the single element work with
*ngFor because it only works with arrays -->
<span *ngFor="let t of [child]" *ngForTemplate="child"></span>
</li>
</ul>
<div>children:{{children}}</div>
<div>templates:{{templates}}</div>
`
})
export class ParentComponent {
@Input() title;
@ContentChildren(TemplateRef) templates;
}
@Component({
selector: 'my-app',
directives: [ParentComponent],
template: `
<h1>Hello</h1>
<parent title="Welcome">
<template><child name="Chris">Blue Team</child></template>
<template><child name="Tom">Red Team</child></template>
</parent>
`,
})
export class AppComponent {}
另见 如何在没有 ngFor 和没有另一个@Component 的情况下多次重复一段 HTML 以获取更多 ngTemplateOutlet
Plunker 示例.
See also How to repeat a piece of HTML multiple times without ngFor and without another @Component for more ngTemplateOutlet
Plunker examples.
更新 Angular 5
ngOutletContext
重命名为 ngTemplateOutletContext
另见https:///github.com/angular/angular/blob/master/CHANGELOG.md#500-beta5-2017-08-29
这篇关于Angular2 子组件作为数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!