我正在使用带有PF 5.2和JSF 2.2的Wildfly 9.0.1。 我需要使用子表填充数据表,该子表显示特定于我正在迭代的每个选项卡的标题和行。 以下"模型树"希望显示:
- >标签(moduleName)
- > - >头
- > - > - >行
XHTML:
151103 19:45:27 mysqld_safe Logging to '/usr/local/mysql/data/Marshalls-MacBook-Air.local.err'.
151103 19:45:27 mysqld_safe A mysqld process already exists
我应该使用<p:tabView id ="tabView1" value="#{moduleBean.modules}" var="tabItem">
<p:tab title="#{tabItem.moduleName}" >
<p:dataTable id="mainTable" value="#{subTableView.getAllHeaders(tabItem.moduleName)}" var="head" >
<p:subTable id="subTable1" value="#{head.rows}" var="row">
和@PostConstruct
初始化方法进行这种昂贵的操作,但JSF不允许在没有void的情况下使用init()
。
所以我称之为&#34;懒惰的方法&#34; init()
但它不会在选项卡迭代期间通过getAllHeaders(String)
更改字符串。
Tab中的任何方法都是通过Headers和Rails正确迭代,以生成一个地图列表。
奇怪的是,虽然我需要调用与生成制表符相同的时间来调用此方法,但此方法仅调用ONCE或TWICE,而不是例如三次。
但是,如果我在tabItem.moduleName
方法的Bean中没有if语句(不是懒惰),我就会使用Tabs与Headers和Rows进行正确的树形显示
但Tab中的任何方法都不是通过Headers和Rails迭代来生成一个Map of Map。
豆:
getAllHeaders(String)
服务:
@PostConstruct
public void init() {
this.modules = publicService.getAllModules();
}
// Lazy method
public List<Header> getAllHeaders(String module) {
if (this.headers == null) {
this.headers = publicService.getAllHeaders(module);
}
return this.headers;
}
public List<Header> getHeaders() {
return headers;
}
作为参考,我使用了以下Why JSF calls getters multiple times。
谢谢你的时间。
答案 0 :(得分:0)
解决方案正是Ali Saleh在下面提到的:Primefaces tabview tabChange event fired after displaying tab
解决方案是定位<h:form>
标记以围绕数据表。