<ng-content>
Đối chiếu nội dung vào một yếu tố (nhúng), bạn sẽ cần những yếu tố <ng-content>
như
@Component({
selector: 'parent',
directives: [ChildComponent], // needed?
template: `
<h1>{{title}}</h1>
<ul>
<li *ngFor="letchild of children()">
<ng-content></ng-content>
</li>
</ul>`
})
<ng-content select="xxx">
nhưng điều đó sẽ không làm việc đối với trường hợp sử dụng của bạn bởi vì <ng-content>
không tạo ra nội dung, nó chỉ dự án đó (chỉ hoạt động như một placehoder nơi trẻ em được hiển thị trong mẫu thành phần của bạn.
Mặc dù *ngFor
sẽ sản xuất 3 <ng-content>
yếu tố, trẻ em sẽ chỉ được hiển thị một lần trong phần tử <ng-content>
đầu tiên.
<ng-content>
cho phép sử dụng bộ chọn như
<ng-content select="[name=Chris]"></ng-content>
nơi một mẫu như
<ul>
<li>
<ng-content select="[name=Chris]"></ng-content>
</li>
</ul>`
sẽ cho kết quả trong
<h1>Welcome</h2>
<ul>
<li><b>Chris</b> is on the Blue Team</li>
</ul>
Một cách tiếp cận linh hoạt hơn và mạnh mẽ được giải thích trong Binding events when using a ngForTemplate in Angular 2 (từ @ kemsky s bình luận)
<template>
, @ViewChildren()
, và *ngForTemplate
Nếu bạn quấn con trong <template>
thẻ bạn có thể truy cập chúng bằng @ContentChildren()
và chèn chúng bằng cách sử *ngFor
và *ngForTemplate
.
Tôi đang sử dụng một chút hack ở đây với bên trong *ngFor
. Có một phương pháp làm việc tốt hơn cơ bản dở dang (ngTemplateOutlet
https://github.com/angular/angular/pull/8021 đã được sáp nhập)
@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 {}
Plunker example
Xem thêm How to repeat a piece of HTML multiple times without ngFor and without another @Component để biết thêm ngTemplateOutlet
ví dụ Plunker.
cập nhật góc 5
ngOutletContext
được đổi tên thành ngTemplateOutletContext
Xem thêm https://github.com/angular/angular/blob/master/CHANGELOG.md#500-beta5-2017-08-29
Có thể đạt được điều đó, nhưng nó chỉ là quá nhiều công việc, bạn có thể nhận được ví dụ rất gần [ tại đây] (http://stackoverflow.com/questions/36730210/binding-events-when-using-a-ngfortemplate-in-angular-2/36732644?noredirect=1#comment61052816_36732644) – kemsky