tabview与数据表正确的方法问题

时间:2015-11-03 19:28:00

标签: jsf primefaces datatable lazy-initialization tabview

我正在使用带有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

谢谢你的时间。

1 个答案:

答案 0 :(得分:0)

解决方案正是Ali Saleh在下面提到的:Primefaces tabview tabChange event fired after displaying tab

解决方案是定位<h:form>标记以围绕数据表。