【问题标题】:Grid with nested template rendering带有嵌套模板渲染的网格
【发布时间】:2014-07-07 16:45:46
【问题描述】:

我有一个像这样的对象 A:

class A
{
   String name;
   List<B> bList;
}

class B
{
   String name;
}

我想在 ZK Grid 中渲染它,以便 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 与列表框类似,但我既没有列表框也没有 MVVM 实现。

为了清楚起见,我现在可以使用 RowRenderer 并通过 Java 代码以编程方式创建每个单元格,但我想找到一个声明式解决方案。每个单元格根据其内容具有不同的 CSS 属性和事件,因此通过 Java 代码执行此操作会产生一些我不习惯的高耦合。

那么如何嵌套两个模板来实现这个功能呢?

编辑: 这是一个描述我要实现的目标的小提琴: http://www.zkfiddle.org/sample/25qpefb/3-Grid-with-template

这个想法是 Activity 对象应该被表示为每个在同一行中的单元格。位读取

&lt;cell&gt;${each.activities}&lt;/cell&gt;

应该换成我想做的事。请记住,即使在小样本数据中,您也可以简单地使用附加条目静态引用每个活动对象,它可能是可变数量的元素,而在实际数据中,它最多可达 40 个元素。

【问题讨论】:

  • 您能提供一个当前代码的工作示例吗?
  • 是 MVVM 还是 MVC 导致您的 zul 代码更关注 MVC 而不是 MVVM。 MVVM 中网格中的网格示例:stackoverflow.com/questions/21173839/…
  • @chillworld 是的,正如我所说的,我正在使用 MVC。网格中的网格可能会起作用,但必须有一种方法来做我想做的事情,对吧?最后,它只是一个具有可变行数和列数的常规网格
  • @bidifx 我会尝试创建一个小提琴
  • 当然,但这涉及到 foreach,否则你不能向你的 zul 声明它是关于多个对象的

标签: grid zk


【解决方案1】:

您可以在您的&lt;cell&gt;${each.bList}&lt;/cell&gt; 上使用forEach

根据您的评论: 另一种选择是自定义RowRenderer,您可以在 ZK 的GridRowRenderer Javadocs 中找到更多相关信息。当您追求表演时,请不要错过有关RowRendererExt.DETACH_ON_RENDER 的部分。

她是给你的一些示例代码。它应该给你一个 clou 如何做到这一点。无论如何,性能可以提高。

为您的网格设置rowRenderer

<grid id="myGrid" rowRenderer="@{base$composer.renderer}" model="@{base$composer.gridModel}">

为您的作曲家添加一个吸气剂:

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);
        }
    };
}

【讨论】:

  • 没错,但经验告诉我——foreach 实现的性能很糟糕。它使我的页面渲染速度减慢了 5 秒。
  • 根据您最近的编辑:这是我现在的解决方案。我想要实现的是相同的行为,但以声明方式。我发布的小提琴过于简单,但实际上我定义了每个单元格上的事件以及基于其内容的 css 属性。因此,如果可能,我宁愿在 &lt;template&gt; 元素上以声明方式执行此操作,而不是依赖导致高耦合的 Java 代码。
  • 老兄!第一时间说明这个怎么样? :-/
  • 对不起,我以为我有:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-19
  • 2014-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多