【问题标题】:Primefaces DataTable - rowSelectListener hiding CommandButton inside rowsPrimefaces DataTable - rowSelectListener 在行内隐藏命令按钮
【发布时间】:2012-10-17 11:10:16
【问题描述】:

我有一个 PrimeFaces 数据表,其中每一行都有一个 savedelete 和另一个 commandButton。数据表有selectionMode="single"rowSelectListener。当我点击命令按钮时,rowSelectListener 被触发,但 commandButton 的动作没有被触发。

怎么办?我需要两个都开火!

我不能使用immediate="true",因为在dataTable 之外有一些表单字段必须提交。它适用于在命令按钮中添加的immediate="true"

Primafaces 版本:2.2.1 JSF 版本:2.0.3

提前感谢您提供任何线索!

代码:

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
            xmlns:ui="http://java.sun.com/jsf/facelets"
            xmlns:h="http://java.sun.com/jsf/html"
            xmlns:f="http://java.sun.com/jsf/core"
            xmlns:v="http://java.sun.com/jsf/composite/composite"
            xmlns:p="http://primefaces.prime.com.tr/ui">
    <h:form id="contractReasonAddFormId">
            <span class="error">
                <h:messages /> 
            </span>
    <h:panelGrid columns="2" cellspacing="5" >
        <h:outputLabel class="label" value="#{resourceBundle.coAddReason_coStatus_label_Key}" />
        <h:outputText class="output" value="#{selectedContractService != null ? selectedContractService.COS_STATUS_DESC : contract.CO_STATUS_DESC}" />
        <h:outputLabel class="label" for="reasonId" value="#{resourceBundle.contractChangeStatus_NewReason_Key}:" />
        <h:selectOneMenu id="reasonId" value="#{bbNewStatusReason.selectedString}" required="true" requiredMessage="#{resourceBundle.contractChangeStatus_NewReason_Key} #{resourceBundle.valueIsRequired}">
            <f:selectItem itemValue="" itemLabel="- #{resourceBundle.contractChangeStatus_SelectReason_Key} -" />
            <f:selectItems value="#{bbNewStatusReason.list}" var="r" itemValue="#{r.REASON}" itemLabel="#{r.RS_DES}" />
        </h:selectOneMenu>
    </h:panelGrid>
    <!-- some other form fields --->
    <h:panelGrid>
        <p:dataTable 
        id="currentStatusReasonTable" 
        value="${bbCurrentStatusReason.list}" 
        var="currStReason"
        selectionMode="single"
        selection="#{bbCurrentStatusReason.selectedItem}"
        rowSelectListener="#{contractAddReasonAction.selectReason}" onRowSelectUpdate="reasonValidityTimes"         
        >
            <p:column sortBy="#{currStReason.RS_DES}" headerText="#{resourceBundle.coAddReason_currStReason_label_Key}">
                <h:outputText value="#{currStReason.RS_DES}: "/>
            </p:column>
            <!-- Other columns -->
            <p:column headerText="#{resourceBundle.coAddReason_action_facet_Key}">
                <p:commandButton id="updateReasonId" action="dlgUpdate" image="ui-icon ui-icon-pencil" title='#{resourceBundle["button.save"]}' disabled="#{selectedContractService != null ? currStReason.LEVEL == 'C' : false}" >
                    <f:setPropertyActionListener target="#{bbCurrentStatusReason.selectedItem}" value="#{currStReason}" />
                </p:commandButton>
                <p:commandButton id="deleteReasonId" action="dlgDelete" image="ui-icon ui-icon-circle-minus" title='#{resourceBundle["button.delete"]}' disabled="#{selectedContractService != null ? currStReason.LEVEL == 'C' : false}" >
                    <f:setPropertyActionListener target="#{bbCurrentStatusReason.selectedItem}" value="#{currStReason}" />
                </p:commandButton>
                <p:commandButton id="generateDeleteDocumentsId" action="generateDeleteDocuments" image="ui-icon" title='#{resourceBundle["button.generateDocumentsForDel"]}' immediate="true" rendered="#{showPrintDocument != null}" >
                    <f:setPropertyActionListener target="#{bbCurrentStatusReason.selectedItem}" value="#{currStReason}" />
                </p:commandButton>
            </p:column>

        </p:dataTable>

    </h:panelGrid>
    </h:form> 
</ui:composition>

【问题讨论】:

    标签: java datatable primefaces


    【解决方案1】:

    我遇到了同样的问题。我最终在 commandButton 上使用的是 onclick 属性中的 event.stopPropagation() 。这是我的删除按钮。

    <p:commandButton icon="ui-icon-trash"
                                 onclick="connDelConfirm.show(); event.stopPropagation();" 
                                 actionListener="#{connectionController.setSelectedConnection(connection)}"
                                 disabled="#{connection.deleted}"/>
    

    onclick 属性上的其他操作打开删除操作的确认对话框。由于事件的传播已停止。我需要一种方法来仍然设置要删除的选定项目。这是通过动作监听器完成的。我只是简单地调用了 bean 中的 setSelectedItem 方法,并将 dataTable 中的 'var' 属性传递给它。

    【讨论】:

      【解决方案2】:

      组件绑定用于immediate="true"的输入组件。

      你必须使用immediate="true"输入组件动作组件之间玩。

      需要参考JSF Lifecycleimmediate="true"的效果;

      BeanOne.java

      @ManagedBean(name="BeanOne")
      @RequestScoped
      public class BeanOne {
          private HtmlInputText inputText;
      
          public HtmlInputText getInputText() {
              return inputText;
          }
      
          public void setInputText(HtmlInputText inputText) {
              this.inputText = inputText;
          }
      
          public void show() {
              System.out.println("HtmlInputText ==>" + inputText.getValue());
          }
      }
      

      pageOne.xml

      <h:inputText binding="#{BeanOne.inputText}" immediate="true"/><br/>
      <h:commandButton value="Show_1" action="#{BeanOne.show}" immediate="true"/>
      <h:commandButton value="Show_2" action="#{BeanOne.show}"/>
      

      【讨论】:

      • 您好,谢谢您的回答。然而,我面临的问题却完全是另外一回事。发生的事情是该动作可以正常触发,但是有一个带有“required = true”的jsf元素-这引发了一个验证错误,该错误没有出现在任何地方-甚至在控制台中也没有。更新(ajax)页面布局的错误信息显示面板后,看到了错误信息。
      【解决方案3】:

      感谢您的回答。然而,我面临的问题的根本原因却完全是另外一回事。

      发生的事情是动作被触发了,但是有一个带有“required=true”的jsf元素——这引发了一个没有出现在任何地方的验证错误——甚至在控制台中也没有。更新(在primaface命令按钮,ajax - 使用'update ='属性)页面布局的错误消息显示窗格后,可以看到错误消息。

      谢谢你, 拉贾希·穆克吉

      【讨论】:

        猜你喜欢
        • 2012-08-08
        • 1970-01-01
        • 2017-10-04
        • 2014-07-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多