我正在尝试使用PrimeNG的p-dataScroller构建一个通用列表组件,如下所示:
<div>
<p-dataScroller [value]="items" ...more properties...>
<template let-listItem>
<div (click)="select(listItem)">
<template [ngTemplateOutlet]="itemTemplate"
[ngOutletContext]="{'item': listItem, 'selected': listItem == selectedItem}"></template>
</div>
</template>
</p-dataScroller>
</div>
p-dataScroller本身使用模板传播items
数组中的每个项目
selectedItem
和select()
是相应通用列表组件的方法。在这个组件中,我声明itemTemplate
像这样:
@ContentChild(TemplateRef)
public itemTemplate: TemplateRef<any>;
最后我以下列方式使用我的通用列表组件:
<generic-list [items]="someArray">
<template>
<list-item [itemType]="itemType">
<template let-item>
<i class ="fa" [ngClass]="{'fa-lock': item.visibility == 0,
'fa-users': item.visibility == 1}"></i>
</template>
</list-item>
</template>
</generic-list>
如您所见,模板组件(list-item
)本身有另一个模板!
首先,我想知道这是否存在问题(三个嵌套模板),但更重要的是,ngOutletContext
中的值似乎没有添加到每个list-item
。 { - 1}}和item
输入参数都存在于list-item组件中,但似乎没有设置它们。在调试时,Angular 2正确地将list-item组件添加为列表条目,但抛出异常,因为它缺少selected
中的item
输入参数。有趣的是,AfterContentInit
输入参数设置正确,可能是因为它不属于itemType
。
我无法在通用列表组件模板中移动list-item组件,从而降低了复杂性,因为可以使用几种不同类型的项目(所有这些项目都有ngOutletContext
,{{ 1}}等等。
如何使用其他模板中的值正确设置模板的item
参数?
答案 0 :(得分:8)
除
外,一切都正确<generic-list [items]="someArray">
<!-- had to declare the 'ngOutletContext' values here!! -->
<template let-item-"item" let-selected="selected">
<!-- makes using it here easy -->
<list-item [item]="item" [selected]="selected" [itemType]="itemType">
<template>
...
</template>
</list-item>
</template>
</generic-list>
这真的很难找到。找不到关于此主题的任何文档。