JSF 动态绑定命令按钮

Posted

技术标签:

【中文标题】JSF 动态绑定命令按钮【英文标题】:JSF binding command button dynamically 【发布时间】:2013-06-07 12:29:27 【问题描述】:

我有一个动态构建选项卡的 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>

这是创建选项卡并使用 maintence_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】:

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

【讨论】:

我添加了构建选项卡的代码。这也在视图范围内。 非常感谢,效果很好。将它绑定到复合材料本身是个好主意。 我在使用命令按钮时遇到了同样的排序问题。排序会引发找不到属性的错误。它正在从最后一个构建的数据表的表列表中的类中查找属性。当我在选项卡之间切换或点击命令按钮时会发生此错误。有没有办法将排序绑定到组合本身。不知道如何解决这个问题。 感谢您的回答。第二个解决方案真的很好。

以上是关于JSF 动态绑定命令按钮的主要内容,如果未能解决你的问题,请参考以下文章

如何将命令绑定添加到动态按钮?

JSF 复杂表单 - 绑定错误

前端vue.js实现按钮的动态绑定

带单选按钮的角度动态 html 绑定

js 动态添加的按钮 onclick事件怎么写?

Xamarin 中具有绑定和命令的按钮列表