动态JSF绑定命令按钮

时间:2013-06-11 15:19:13

标签: jsf primefaces

我有一个动态构建标签的JSF页面。在每个选项卡中都有一些输入字段和一个命令按钮。构建选项卡时,将动态构建字段和按钮。当我向命令按钮添加绑定属性时,只生成一个选项卡中的一个按钮。每个选项卡中都应该有一个命令按钮。当我删除绑定属性时,所有按钮都在那里但没有进行必要的验证。如何为循环中创建的每个命令按钮添加唯一的绑定值。

以下所有代码都位于一个循环内,该循环在标签视图中生成标签。

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

1 个答案:

答案 0 :(得分:2)

binding属性基本上是视图范围的。您不能将同一视图中的多个组件物理绑定到同一个视图范围变量。它只能引用一个组件。在您的情况下,基本上每个组件在设置该属性时都会相互覆盖,这样您最终只会看到一个,这是最后一个。

您不清楚如何创建选项卡,但您应该以某种方式在绑定属性中使用的变量中包含选项卡标识符。也许是这样的?

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]}" ... />

更新,等待它是复合材料,另一种方法是将其绑定到复合材料本身

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