JSF Primefaces数据表,第一行的第一个单元格在使用Columns标记时使用以前的数据表值

时间:2013-06-03 21:05:27

标签: jsf primefaces composite-component

以下代码通过数据库中的列表循环,并为每个条目构建数据表。每个条目都有一个列表,列表将显示在数据表中。我遇到的问题是,复合代码中的p:列的value属性在第二次调用复合时不会被更改。它似乎缓存了列的初始列表。有没有办法重置columns标签,以便它使用新的列列表。

UPDATE 似乎第二个数据表正在使用先前数据表的行值名称作为第一个单元格的第一行。其他一切都很好。这是一个截图

第二次更新我还注意到,如果你转到第二个数据表的第二页然后回到第一页,那么在图像中圈出的破碎单元用正确的方法修复它的自我值。

第3次更新在我的代码中,我使用的是ui:repeat标签。我还使用了primeface:accordian标签,它们都产生了问题。我使用c:forEach标记更改了ui:repeat标记,并修复了下图中的问题。我还有的问题是我需要将它放在一个primefaces的手风琴标签中,以便我可以为每个数据表动态构建一个标签。我认为我的问题出现在数据表的p:columns标签中,但它现在似乎在ui:reat或p:accordian标签中,它们都使用value =“#{myBeanList}”属性

enter image description here

 <ui:repeat var="codetable" value="#{pc_Maintenence.codeMaintenenceTables}">
        <util:maintenence_code pageBean="#{pc_Maintenence}" dataTableInfo="#{codetable}"
                paginator="true" rows="10"/>
    </ui:repeat>

这是在上面的代码util:maintenence_code。

中调用的复合代码
    <composite:interface>
        <composite:attribute name="pageBean" required="true" />
        <composite:attribute name="dataTableInfo" required="true" />
        <composite:attribute name="paginator" type="java.lang.Boolean" />
        <composite:attribute name="rows" />
    </composite:interface>

    <composite:implementation>

        <p:panel id="pnl_doc_code_table">
           <p:dataTable value=#{cc.attrs.pageBean.getDataTableList(cc.attrs.dataTableInfo.tableListName)}"
                var="tblVar" paginator="#{cc.attrs.paginator}"
                rows="#{cc.attrs.rows}" dynamic="true" cache="false">

                 <p:columns var="column" styleClass="columns" id="columns" value="#{cc.attrs.dataTableInfo.columns}">

                       #{tblVar[column.name]}

                  </p:columns>
              </p:dataTable>
           </p:panel>
   </composite:implementation>

1 个答案:

答案 0 :(得分:0)

我已经解决了这个问题。问题似乎是在创建动态primefaces时:使用primefaces:columns标签的数据表。当数据表在ui:repeat标签内创建或使用primefaces:accordianPanel的循环能力时,在第一行之后创建的每个数据表在第一行的第一个单元格中都有错误的值。数据表中的所有其他单元格都具有正确的值。我还注意到headerText是错误的,总是来自之前的数据表headerText(第一个数据表的headerText总是正确的。)

为了解决这个问题,我将jstl:forEach标记放在了primefaces:accordianPanel标记内。这解决了这个问题。这似乎是ui:repeat和/或primefaces的一个问题:accordianPanel正在渲染数据表。这是正常工作的代码。

<h:form styleClass="form" id="frmcodes">
        <p:tabView styleClass="tabView" id="tabview_maintenence" rendered="#{user.khecorpAdmin}">
            <p:tab id="tab_code_tables" title="Code Tables">
                <p:accordionPanel id="pnl_accord_codetables">
                   <c:forEach items="#{pc_Maintenence.codeMaintenenceTables}" var="codetable">
                       <p:tab title="#{codetable.tableName}">                   
                           <util:maintenence_code pageBean="#{pc_Maintenence}" dataTableTemplate="#{codetable}"/>
                       </p:tab>
                    </c:forEach>
                </p:accordionPanel>
             </p:tab>
          </p:tabView>
          <p:messages id="msg" autoUpdate="true"/>
    </h:form>

以下是构建数据表的复合代码

<composite:interface>
        <composite:attribute name="pageBean" required="true"/>
        <composite:attribute name="dataTableTemplate" required="true" />
    </composite:interface>

    <composite:implementation>
        <p:panel id="pnl_table">

            <p:dataTable value="#{cc.attrs.pageBean.getDataTableList(cc.attrs.dataTableTemplate.tableListName)}"
                var="tblVar" paginator="true" rows="10" rowIndexVar="tblIndx"
                editable="#{cc.attrs.dataTableTemplate.editable}">

                <p:columns id="columns" value="#{cc.attrs.dataTableTemplate.columns}" 
                    var="column" headerText="#{column.heading}">

                    <p:cellEditor>
                        <f:facet name="output">
                            <h:outputText value="#{tblVar[column.name]}"/>
                        </f:facet>

                        <f:facet name="input" rendered="#{column.editable}">
                            <p:inputText value="#{tblVar[column.name]}" rendered="#{column.editable}"/>
                        </f:facet>
                    </p:cellEditor>
                </p:columns>
                <p:column rendered="#{cc.attrs.dataTableTemplate.editable}">  
                    <p:rowEditor /> 
                </p:column>
            </p:dataTable>
        </p:panel>
    </composite:implementation>