1

タブを動的に構築する JSF ページがあります。各タブには、いくつかの入力フィールドとコマンド ボタンがあります。フィールドとボタンは、タブの作成時に動的に作成されます。コマンド ボタンにバインド属性を追加すると、1 つのタブに 1 つのボタンしか生成されません。すべてのタブにコマンド ボタンが必要です。バインディング属性を削除すると、すべてのボタンが表示されますが、必要な検証は行われません。ループで作成された各コマンド ボタンに一意のバインド値を追加するにはどうすればよいですか。

以下のコードはすべて、タブ ビューでタブを生成するループ内にあります。

    <ui:repeat value="#{cc.attrs.dataTableTemplate.columns}" var="column">
        <p:outputLabel styleClass="outputLabel" value="#{column.heading}" 
            for="inputtext" rendered="#{column.editable}"/>
        <p:inputText value="#{cc.attrs.dataTableTemplate.collectorValue[column.name]}" 
            rendered="#{column.editable}"
            id="inputtext" required="#{not empty param[add.clientId]}"/>
        <div class="clear">&#160;</div>
    </ui:repeat>
    <p:commandButton styleClass="commandButton"
         binding="#{add}"
         value="add"
         update="pnl_codetable @parent"
         title="Add">
        <p:collector value="#{cc.attrs.dataTableTemplate.collectorValue}" 
           addTo="#{cc.attrs.pageBean.getDataTableList(
           cc.attrs.dataTableTemplate.tableListName)}" />
    </p:commandButton>

タブを作成し、maintenence_code タグを使用して上記のコードを呼び出すコードを次に示します。

    <p:accordionPanel id="pnl_accord_codetables" dynamic="true" cache="false">
         <p:ajax event="tabChange" listener="#{pc_Maintenence.onTabChange}"/>
         <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>
4

1 に答える 1

2

属性はbinding基本的にビュー スコープです。同じビュー内の複数のコンポーネントを 1 つの同じビュー スコープ変数に物理的にバインドすることはできません。参照できるコンポーネントは 1 つだけです。あなたの場合、基本的にすべてのコンポーネントは、その属性の設定中に互いにオーバーライドしているため、最後のコンポーネントである 1 つだけが表示されます。

タブを作成する方法については明確ではありませんが、バインディング属性で使用される変数に何らかの方法でタブ識別子を含める必要があります。おそらくこのようなものですか?

faces-config.xml:

<managed-bean>
    <managed-bean-name>components</managed-bean-name>
    <managed-bean-class>java.util.HashMap</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
</managed-bean>

意見:

<c:set var="buttonId" value="add_#{someTabId}" />
...
<p:inputText ... required="#{not empty param[components[buttonId].clientId]}" />
...
<p:commandButton binding="#{components[buttonId]}" ... />

Update、コンポジットになるのを待ちます。別の方法は、それをコンポジット自体にバインドすることです

<cc:interface componentType="myComposite">
...
<p:inputText ... required="#{not empty param[cc.add.clientId]}" />
...
<p:commandButton binding="#{cc.add}" ... />

@FacesComponent("myComposite")
public class MyComposite extends UINamingContainer {

    private UICommand add; 

    // +getter +setter
}
于 2013-06-11T15:25:37.863 に答える