Zk 宏组件列表框渲染
Zk Macrocomponent Listbox rendering
我有一个像这样的宏组件。
<listbox id="results">
<listitem id='listitem' self="@{each=d}">
<listcell label='@{d.column1}'/>
<listcell label='@{d.column2}'/>
<listcell label='@{d.column3}'/>
<listcell label='@{d.column4}'/>
</listitem>
</listbox>
我使用 BindingListModelList 设置集合模型,就像常规列表框一样。
列表框已呈现,但只有第 1 列并显示了适配器的 toString 方法。
final List<Students>students = ...........
results.setModel(new BindingListModelList<>(students,false));
然后显示 Student 的 toString() 方法 class。
我试过这个语法
<listitem id='listitem' self="@{each=${arg.includer.adapters}}">
<listcell label='${arg.includer.adapters[self.columIndex].column1}'/>
<listcell label='${arg.includer.adapters[self.columIndex].column2}'/>
<listcell label='${arg.includer.adapters[self.columIndex].column3}'/>
<listcell label='${arg.includer.adapters[self.columIndex].column4}'/>
</listitem>
并且 HTMLMacroComponent class 有一个方法 getAdapters returns 要显示的数据。
public class StudentDetail extends HtmlMacroComponent{
public List<Students>getAdapters(){
return adapters;
}
}
但我无法让它发挥作用。当您使用 new Listbox() 创建列表框并且不设置 itemRender 时,看到没有 itemRender。
据我所知,问题是你的 zul 只是添加了一个 listitem(即 1,而且只有 1 个 listitem),而不是 模板 告诉列表框如何渲染您的模型。 (至少从你的代码片段来看,我假设你想使用模板。如果我误解了你,请告诉我。)
您的代码所做的是:解析 zul 以构建组件,这将创建您在此处定义的 1 个列表项。然后它设置模型,删除所有现有的列表项(即您在 zul 中创建的列表项),并使用 itemrenderer 或提供的模板呈现模型值。由于您没有提供,它默认只渲染一列 toString()
.
像这样尝试:
<listbox>
<template name="model">
<listitem>
<listcell label="${each.column1}"/>
<listcell label="${each.column2}"/>
<listcell label="${each.column3}"/>
<listcell label="${each.column4}"/>
</listitem>
</template>
</listbox>
您可以在此处阅读有关模板的信息:https://www.zkoss.org/wiki/ZK_Developer%27s_Reference/MVC/View/Template/Listbox_Template
或者,您可以使用 Listbox.setItemRenderer()
来使用基于 Java 的渲染器而不是模板。
请注意,您在这里混淆了很多 zk 的东西:
@
仅用于数据绑定。如果你想使用 zk 表达式语言(带大括号的东西),它以 $
开头
self
在 zul 中不是一个好的变量名,因为当您想在 zul 的侦听器中引用它时,它已经引用了组件本身。
- 只有当列表项获得不同的 ID,并且您知道这些 ID 时,才有意义。通常,在使用模型(即动态数据)时,ID 对您没有帮助。
在 ZK 论坛中提出并回答了同样的问题:
http://forum.zkoss.org/question/105543/zk-653-listbox-macrocomponent/
我有一个像这样的宏组件。
<listbox id="results">
<listitem id='listitem' self="@{each=d}">
<listcell label='@{d.column1}'/>
<listcell label='@{d.column2}'/>
<listcell label='@{d.column3}'/>
<listcell label='@{d.column4}'/>
</listitem>
</listbox>
我使用 BindingListModelList 设置集合模型,就像常规列表框一样。
列表框已呈现,但只有第 1 列并显示了适配器的 toString 方法。
final List<Students>students = ...........
results.setModel(new BindingListModelList<>(students,false));
然后显示 Student 的 toString() 方法 class。
我试过这个语法
<listitem id='listitem' self="@{each=${arg.includer.adapters}}">
<listcell label='${arg.includer.adapters[self.columIndex].column1}'/>
<listcell label='${arg.includer.adapters[self.columIndex].column2}'/>
<listcell label='${arg.includer.adapters[self.columIndex].column3}'/>
<listcell label='${arg.includer.adapters[self.columIndex].column4}'/>
</listitem>
并且 HTMLMacroComponent class 有一个方法 getAdapters returns 要显示的数据。
public class StudentDetail extends HtmlMacroComponent{
public List<Students>getAdapters(){
return adapters;
}
}
但我无法让它发挥作用。当您使用 new Listbox() 创建列表框并且不设置 itemRender 时,看到没有 itemRender。
据我所知,问题是你的 zul 只是添加了一个 listitem(即 1,而且只有 1 个 listitem),而不是 模板 告诉列表框如何渲染您的模型。 (至少从你的代码片段来看,我假设你想使用模板。如果我误解了你,请告诉我。)
您的代码所做的是:解析 zul 以构建组件,这将创建您在此处定义的 1 个列表项。然后它设置模型,删除所有现有的列表项(即您在 zul 中创建的列表项),并使用 itemrenderer 或提供的模板呈现模型值。由于您没有提供,它默认只渲染一列 toString()
.
像这样尝试:
<listbox>
<template name="model">
<listitem>
<listcell label="${each.column1}"/>
<listcell label="${each.column2}"/>
<listcell label="${each.column3}"/>
<listcell label="${each.column4}"/>
</listitem>
</template>
</listbox>
您可以在此处阅读有关模板的信息:https://www.zkoss.org/wiki/ZK_Developer%27s_Reference/MVC/View/Template/Listbox_Template
或者,您可以使用 Listbox.setItemRenderer()
来使用基于 Java 的渲染器而不是模板。
请注意,您在这里混淆了很多 zk 的东西:
@
仅用于数据绑定。如果你想使用 zk 表达式语言(带大括号的东西),它以$
开头
self
在 zul 中不是一个好的变量名,因为当您想在 zul 的侦听器中引用它时,它已经引用了组件本身。- 只有当列表项获得不同的 ID,并且您知道这些 ID 时,才有意义。通常,在使用模型(即动态数据)时,ID 对您没有帮助。
在 ZK 论坛中提出并回答了同样的问题:
http://forum.zkoss.org/question/105543/zk-653-listbox-macrocomponent/