Angular 2 模板作为组件的参数
Angular 2 Template as a parameter to component
我的简化目标是构建一个组件,它是一个带有项目模板的列表。例如:
<list>item</list>
这是我的代码:
import {bootstrap} from 'angular2/platform/browser';
import {Component} from 'angular2/core';
@Component({
selector: 'list',
template: `
<ul>
<li *ngFor="let i of items" >
<ng-content></ng-content>
</li>
</ul>
`
})
class List {
items = [1, 2, 3];
}
@Component({
selector: 'app',
directives: [List],
template: '<list>item</list>'
})
class App { }
bootstrap(App, []);
预期结果:
- 项目
- 项目
- 项目
实际结果:
•
•
• 项目
AFAI试过<ng-content>
不能重复绑定,但是你可以把item
作为输入,像这样
import {Component} from 'angular2/core';
@Component({
selector: 'list',
inputs: ['htmlIN'],
template: `
<ul>
<li *ngFor="#i of items" >
{{i}} {{htmlIN}}
</li>
</ul>
`
})
export class List {
htmlIN: any;
items = [1, 2, 3, 4];
}
@Component({
selector: 'my-app',
directives: [List],
template: `<list htmlIN="item"></list>`
})
export class App {
constructor(){
}
}
我会考虑稍微改变一下设计。我不会在 <list>
和 </list>
之间插入内容并通过 List
组件中的 ng-content
引用此类内容,而是创建一个扮演内容角色的组件(即 "repeat template with local variables passed, so each item is different") 与所需的输入变量并将组件插入到列表中。换句话说就是这样
ContentComponent
@Component({
selector: 'my-content',
inputs: ['inputVar'],
template: `<div>Item no. {{inputVar}}</div>`
})
export class MyContent {
inputVar: string;
}
列表
@Component({
selector: 'list',
directives: [MyContent],
template: `
<ul>
<li *ngFor="let i of items" >
<my-content [inputVar]="i"></my-content>
</li>
</ul>
`
})
class List {
items = [1, 2, 3];
}
希望对你有帮助
我找到了 3 种方法
@Component({
selector: 'dynamic-list',
template: '<div *ngFor="#item of items" *ngForTemplate="itemTemplate"></div>'
})
export class DynamicListComponent {
@ContentChild(TemplateRef)
public itemTemplate: TemplateRef;
@Input()
public items: number[];
}
<dynamic-list [items]="items">
<div template="#item">
Inline template item #: {{item}}
</div>
</dynamic-list>
输出:
Inline template item #: 1
Inline template item #: 2
Inline template item #: 3
Inline template item #: 4
笨蛋:https://plnkr.co/edit/ollxzUhka77wIXrJGA9t?p=preview
查看更多https://github.com/ilio/ng2-dynamic-components/blob/master/README.md
我是这样做的:
用法:
<ng-template #myTemplate let-item="item">
<strong>Name: </strong> {{item.name}}<br>
<strong>Id: </strong> {{item.id}}
</ng-template>
<app-template-param [items]="items" [template]="myTemplate"></app-template-param>
组件:
@Component({
selector: 'app-template-param',
templateUrl: 'template-param.html'
})
export class TemplateParamComponent implements OnInit {
@Input() items: Array<any>;
@Input() template: TemplateRef<any>;
}
组件HTML
<ng-template #defaultTemplate let-item="item">
<strong>{{item.name}}</strong>
</ng-template>
<ul>
<li *ngFor="let item of items">
<ng-template [ngTemplateOutlet]="template || defaultTemplate" [ngTemplateOutletContext]="{item: item}"></ng-template>
</li>
</ul>
我的简化目标是构建一个组件,它是一个带有项目模板的列表。例如:
<list>item</list>
这是我的代码:
import {bootstrap} from 'angular2/platform/browser';
import {Component} from 'angular2/core';
@Component({
selector: 'list',
template: `
<ul>
<li *ngFor="let i of items" >
<ng-content></ng-content>
</li>
</ul>
`
})
class List {
items = [1, 2, 3];
}
@Component({
selector: 'app',
directives: [List],
template: '<list>item</list>'
})
class App { }
bootstrap(App, []);
预期结果:
- 项目
- 项目
- 项目
实际结果:
•
•
• 项目
AFAI试过<ng-content>
不能重复绑定,但是你可以把item
作为输入,像这样
import {Component} from 'angular2/core';
@Component({
selector: 'list',
inputs: ['htmlIN'],
template: `
<ul>
<li *ngFor="#i of items" >
{{i}} {{htmlIN}}
</li>
</ul>
`
})
export class List {
htmlIN: any;
items = [1, 2, 3, 4];
}
@Component({
selector: 'my-app',
directives: [List],
template: `<list htmlIN="item"></list>`
})
export class App {
constructor(){
}
}
我会考虑稍微改变一下设计。我不会在 <list>
和 </list>
之间插入内容并通过 List
组件中的 ng-content
引用此类内容,而是创建一个扮演内容角色的组件(即 "repeat template with local variables passed, so each item is different") 与所需的输入变量并将组件插入到列表中。换句话说就是这样
ContentComponent
@Component({
selector: 'my-content',
inputs: ['inputVar'],
template: `<div>Item no. {{inputVar}}</div>`
})
export class MyContent {
inputVar: string;
}
列表
@Component({
selector: 'list',
directives: [MyContent],
template: `
<ul>
<li *ngFor="let i of items" >
<my-content [inputVar]="i"></my-content>
</li>
</ul>
`
})
class List {
items = [1, 2, 3];
}
希望对你有帮助
我找到了 3 种方法
@Component({
selector: 'dynamic-list',
template: '<div *ngFor="#item of items" *ngForTemplate="itemTemplate"></div>'
})
export class DynamicListComponent {
@ContentChild(TemplateRef)
public itemTemplate: TemplateRef;
@Input()
public items: number[];
}
<dynamic-list [items]="items">
<div template="#item">
Inline template item #: {{item}}
</div>
</dynamic-list>
输出:
Inline template item #: 1
Inline template item #: 2
Inline template item #: 3
Inline template item #: 4
笨蛋:https://plnkr.co/edit/ollxzUhka77wIXrJGA9t?p=preview
查看更多https://github.com/ilio/ng2-dynamic-components/blob/master/README.md
我是这样做的:
用法:
<ng-template #myTemplate let-item="item">
<strong>Name: </strong> {{item.name}}<br>
<strong>Id: </strong> {{item.id}}
</ng-template>
<app-template-param [items]="items" [template]="myTemplate"></app-template-param>
组件:
@Component({
selector: 'app-template-param',
templateUrl: 'template-param.html'
})
export class TemplateParamComponent implements OnInit {
@Input() items: Array<any>;
@Input() template: TemplateRef<any>;
}
组件HTML
<ng-template #defaultTemplate let-item="item">
<strong>{{item.name}}</strong>
</ng-template>
<ul>
<li *ngFor="let item of items">
<ng-template [ngTemplateOutlet]="template || defaultTemplate" [ngTemplateOutletContext]="{item: item}"></ng-template>
</li>
</ul>