amc*_*dnl 4 angularjs angular2-template angular
在我的数据表项目中,开发人员能够在表声明中声明模板,以用于标题单元格和正文单元格.
<datatable>
<datatable-column name="Name">
<template let-column="column">
Header: {{column.name}}
</template>
<template let-value="value">
Hi: <strong>{{value}}</strong>
</template>
</datatable-column>
<datatable-column name="Age">
<datatable-body-template let-value="value">
I'm: <strong>{{value}}</strong> old
</datatable-body-template>
</datatable-column>
</datatable>
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,第一个模板是标题单元格模板,第二个模板是主体单元格模板,顺序很重要.如果您只声明一个模板,它将只执行体细胞模板.你可以看到这是如何正在做目前这里.
我目前允许你TemplateRef通过a 传递Input给column指令但是这种方法没问题,但作为API使用者,组件定义中的声明性模板是一种更清洁的方法.
值得注意的是,它不可能通过类似的方式进行命名#body,#header因为您可以使用多个列使名称不唯一.
这个DSL不是非常直观,因为它不是非常明确的,哪个取决于订单.ng-content允许你输入一个选择器属性,我想知道用模板完成类似事情的最佳方法是什么?所以类似于:
<datatable>
<datatable-column name="Name">
<datatable-header-template let-column="column">
Header: {{column.name}}
</datatable-header-template>
<datatable-body-template let-value="value">
Hi: <strong>{{value}}</strong>
</datatable-body-template>
</datatable-column>
</datatable>
Run Code Online (Sandbox Code Playgroud)
我正在四处寻找是否有可能超越它,TemplateRef但我不确定那是不是一个好主意.
所以说...我的问题,我怎样才能完成命名的选择器模板引用?
您可以将模板传递给输入
<template #header let-column="column">
Header: {{column.name}}
</template>
<template #body let-value="value">
Hi: <strong>{{value}}</strong>
</template>
<datatable>
<datatable-column name="Name" [header]="header" [column]="body"></datatable-column>
</datatable>
Run Code Online (Sandbox Code Playgroud)
更新
也可以通过这些添加模板变量和查询
<datatable>
<template let-column="column" #header>
header1
</template>
<template let-value="value" #column>
column1
</template>
<template let-value="value" #column>
column2
</template>
Run Code Online (Sandbox Code Playgroud)
@ContentChildren('header', {read: TemplateRef}) headerTemplates:QueryList<TemplateRef>;
@ContentChildren('column', {read: TemplateRef}) columnTemplates:QueryList<TemplateRef>;
Run Code Online (Sandbox Code Playgroud)
或使用指令.此方法允许传递其他信息
@Directive({
selector: '[header]';
})
class HeaderTemplate {
constructor(private template:TemplateRef) {};
@Input() header:String;
}
@Directive({
selector: '[column]';
})
class ColumnTemplate {
constructor(private template:TemplateRef) {};
@Input() column:String;
}
Run Code Online (Sandbox Code Playgroud)
<datatable>
<template let-column="column" header="1">
header1
</template>
<template let-value="value" column="1">
column1
</template>
<template let-value="value" column="2">
column2
</template>
</datatable>
Run Code Online (Sandbox Code Playgroud)
@ContentChildren(HeaderTemplate) headerTemplates:QueryList<HeaderTemplate>;
@ContentChildren(ColumnTemplate) columnTemplates:QueryList<ColumnTemplate>;
Run Code Online (Sandbox Code Playgroud)
性能template和header/ column的headerTemplate/ columnTemplate允许您访问的模板和传递的值(可以有额外的@Inputs(),但一个选择相匹配是最容易使用).