Angular2 中列表组件的自定义模板(没有 ng-content 的包含)
Custom template(transclusion without ng-content) for list component in Angular2
我有一个只显示名字的列表组件。列表组件应该能够采用用户提供的自定义模板。
列表组件
import {Component } from 'angular2/core';
@Component({
selector: 'my-list',
template: `<p>This is List</p>
<ul>
<li *ngFor="#i of data"><div class='listItem'>{{i.name}}</div></li>
</ul>`
})
export class MyList implements OnInit{
data: Array<any> = [{name: 'John', age: 26},{name: 'Kevin', age: 26}, {name:'Simmons', age:26}];
}
我的要求
<my-list>
<div>{{i.name}}-{{i.age}}</div> //user should be able to provide custom template like this
</my-list>
我用 ng-content 试过了,但它抛出了错误。在 angular 1 中,同样的事情用于处理嵌入的内容。我们在 angular 2 中是否有任何替代手动嵌入的方法?如果没有,那么我们如何在 angular2 中实现此功能。
这里是Plunker
过去有一个关于此的问题(请参阅 ),这似乎不受支持。
这里有两件事:
当您为组件提供输入模板时,您的 i
变量将根据当前组件而不是 my-list
进行评估。如果你想使用它的属性,你必须这样做:
<my-list #myList>
<div>{{myList.i.name}}-{{myList.i.age}}</div> //user should be able to provide custom template like this
</my-list>
另一个问题是在循环中使用 ng-content
的能力,但它不受支持。我认为我们可以为此添加一个问题...
这是我用于测试的插件:https://plnkr.co/edit/a06vVP?p=preview。
您需要使用 ngForTemplate,我已经使用这种技术创建了 PrimeNG DataList 和许多其他 DataComponents,并且效果很好。演示;
http://www.primefaces.org/primeng/#/datalist
代码;
https://github.com/primefaces/primeng/blob/master/src/app/components/datalist/datalist.ts
在您的组件中,定义一个带有 contentchild 的 templateRef;
@ContentChild(TemplateRef) itemTemplate: TemplateRef;
您的模板变为;
template: `<p>This is List</p>
<ul>
<template ngFor [ngForOf]="data" [ngForTemplate]="itemTemplate"></template>
</ul>`
以便您的用户可以定义类似的内容;
<my-list>
<template #anything>
<div>{{anything.i.name}}-{{anything.i.age}}</div>
</template>
</my-list>
您可以找到一个简短有趣的指南,向您展示如何使用自定义模板构建这样一个列表组件
here.
我有一个只显示名字的列表组件。列表组件应该能够采用用户提供的自定义模板。
列表组件
import {Component } from 'angular2/core';
@Component({
selector: 'my-list',
template: `<p>This is List</p>
<ul>
<li *ngFor="#i of data"><div class='listItem'>{{i.name}}</div></li>
</ul>`
})
export class MyList implements OnInit{
data: Array<any> = [{name: 'John', age: 26},{name: 'Kevin', age: 26}, {name:'Simmons', age:26}];
}
我的要求
<my-list>
<div>{{i.name}}-{{i.age}}</div> //user should be able to provide custom template like this
</my-list>
我用 ng-content 试过了,但它抛出了错误。在 angular 1 中,同样的事情用于处理嵌入的内容。我们在 angular 2 中是否有任何替代手动嵌入的方法?如果没有,那么我们如何在 angular2 中实现此功能。
这里是Plunker
过去有一个关于此的问题(请参阅
这里有两件事:
当您为组件提供输入模板时,您的
i
变量将根据当前组件而不是my-list
进行评估。如果你想使用它的属性,你必须这样做:<my-list #myList> <div>{{myList.i.name}}-{{myList.i.age}}</div> //user should be able to provide custom template like this </my-list>
另一个问题是在循环中使用
ng-content
的能力,但它不受支持。我认为我们可以为此添加一个问题...
这是我用于测试的插件:https://plnkr.co/edit/a06vVP?p=preview。
您需要使用 ngForTemplate,我已经使用这种技术创建了 PrimeNG DataList 和许多其他 DataComponents,并且效果很好。演示;
http://www.primefaces.org/primeng/#/datalist
代码;
https://github.com/primefaces/primeng/blob/master/src/app/components/datalist/datalist.ts
在您的组件中,定义一个带有 contentchild 的 templateRef;
@ContentChild(TemplateRef) itemTemplate: TemplateRef;
您的模板变为;
template: `<p>This is List</p>
<ul>
<template ngFor [ngForOf]="data" [ngForTemplate]="itemTemplate"></template>
</ul>`
以便您的用户可以定义类似的内容;
<my-list>
<template #anything>
<div>{{anything.i.name}}-{{anything.i.age}}</div>
</template>
</my-list>
您可以找到一个简短有趣的指南,向您展示如何使用自定义模板构建这样一个列表组件 here.