我有一个像这样的对象:
class A
{
String name;
List<B> bList;
}
class B
{
String name;
}
我想在ZK网格中渲染它,以便A元素是行,B元素是列。在我的Composer中,我有一个getAList()
方法,它返回一个A元素列表。
到目前为止,我有这个:
<grid id="myGrid" model="@{base$composer.AList}">
<rows>
<template name="model">
<row align="center">
<cell width="196px">${each.name}</cell>
<cell>${each.bList}</cell>
</row>
</template>
</rows>
</grid>
这会在我的行的最左列上呈现name元素,然后在我的bList ArrayList对象的ArrayList.toString()
上打印另一列。
我现在想要实现的是声明性地告诉ZK将bList中包含的每个B元素渲染为单个单元格。我见过this fiddle与listbox类似,但我既没有列表框也没有MVVM实现。
为了清楚起见,我现在可以使用RowRenderer
并通过Java代码以编程方式创建每个单元格,但我希望找到一个声明性解决方案。每个单元格都根据其内容具有不同的CSS属性和事件,因此通过Java代码实现它会产生一些我不熟悉的高耦合。
那么我如何嵌套两个模板来实现这个功能呢?
编辑: 这是一个小提琴,描述了我想要实现的目标: http://www.zkfiddle.org/sample/25qpefb/3-Grid-with-template
这个想法是Activity对象应该表示为每个同一行中的一个单元格。读取位
<cell>${each.activities}</cell>
应该替换为我想做的事情。请记住,即使在小样本数据中,您也可以通过附加条目静态地引用每个活动对象,它可以是可变数量的元素,而在实际数据中,它可以包含大约40个元素。
答案 0 :(得分:0)
您可以在<cell>${each.bList}</cell>
上使用forEach。
根据您的评论
另一个选项是自定义RowRenderer您可以在ZK的Grid和RowRenderer Javadoc中找到更多相关内容。当你出去表演时,不要错过关于RowRendererExt.DETACH_ON_RENDER
的部分。
她是一些示例代码。它应该给你一个如何做到这一点。无论如何,性能都可以提高。
为您的网格设置rowRenderer
:
<grid id="myGrid" rowRenderer="@{base$composer.renderer}" model="@{base$composer.gridModel}">
为你的作曲家添加一个getter:
public RowRenderer<SingleRow> getRenderer() {
return new RowRenderer<SingleRow>() {
@Override
public void render(Row row, SingleRow data, int index) throws Exception {
new Label(data.getEmployee()).setParent(row);
for (Activity activity : data.getActivities())
new Label(activity.getName()).setParent(row);
}
};
}