具有嵌套模板渲染的网格

时间:2014-06-30 13:15:59

标签: grid zk

我有一个像这样的对象:

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个元素。

1 个答案:

答案 0 :(得分:0)

您可以在<cell>${each.bList}</cell>上使用forEach

根据您的评论 另一个选项是自定义RowRenderer您可以在ZK的GridRowRenderer 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);
        }
    };
}