2

次のコードは、データベースのリストをループして、各エントリのデータ テーブルを作成します。各エントリには、データ テーブルに表示される列のリストがあります。私が抱えている問題は、複合コードの p:columns の値属性が、複合コードが 2 回目に呼び出されたときに変更されないことです。列の初期リストをキャッシュしているようです。新しい列リストを使用するように列タグをリセットする方法はありますか。

UPDATE 2番目のデータテーブルは、最初のセルの最初の行に以前のデータテーブルの行の値の名前を使用しているようです。他のすべては問題ありません。ここにスクリーンショットがあります

2番目の更新2番目のデータテーブルの2番目のページに移動してから最初のページに戻ると、画像の丸で囲まれた壊れたセルが正しい値で自己を修正することにも気付きました。

3 回目の更新以下のコードでは、ui:repeat タグを使用しています。私は primeface:accordian タグも使用しましたが、どちらも問題を引き起こします。ui:repeat タグを ac:forEach タグに変更したところ、下の画像の問題が修正されました。私がまだ抱えている問題は、データテーブルごとに動的にタブを作成できるように、これをprimefacesアコーディオンタグに含める必要があることです。私の問題はデータ テーブルの p:columns タグにあると思っていましたが、現在は ui:reat または p:accordian タグにあるようで、どちらも value="#{myBeanList}" 属性を使用しています

ここに画像の説明を入力

 <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>
4

1 に答える 1

0

私は問題を解決しました。問題は、primefaces:columns タグを使用する動的な primefaces:datatables を作成する場合にあるようです。データ テーブルが 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>
于 2013-06-07T15:49:44.983 に答える