2016-11-21 119 views
0

我有一個託管bean,它是ViewScoped。在這個bean中,我需要發送一個表單(使用h:commandButton)。 這工作正常,除了當我更改我的下拉菜單項(其中觸發一個事件和更新頁面)。 更改下拉菜單的值後,提交表單重新創建bean(並跳過與h:commandButton關聯的操作)。ViewScoped bean重新創建而不是調用表單動作

這裏是我的XML:

<rich:panel styleClass="panel_grid_center fifty_percent" 
     header="Bid matrix"> 

     <!-- display in case the user is not an admin --> 
     <h:panelGroup rendered="#{not loginBean.isAdmin}"> 

      <h:outputText 
       value="You do not have sufficient permission to view this page." /> 
      <br /> 
      <h:form> 
       <h:commandLink action="index.xhtml" 
        value="Click here to go back to login page/search page." /> 
      </h:form> 
     </h:panelGroup> 

     <!-- display if the user is an admin --> 
     <h:panelGroup rendered="#{loginBean.isAdmin}" id="bid_matrices_panel"> 
       <h:panelGrid columns="2"> 

        <!-- customer group panel --> 
        <rich:panel styleClass="contained_width fifty_percent" 
         header="Customer group"> 
         <h:form> 
          <h:selectOneMenu 
           valueChangeListener="#{adminBean.onCustomerGroupChangeListener}" 
           value="#{adminBean.customerGroupService.displayCustomerGroup.spendMinimum}"> 
           <f:selectItems 
            value="#{adminBean.customerGroupService.customerGroups}" 
            var="group" itemLabel="#{group.customerGroupLabel}" 
            itemValue="#{group.spendMinimum}" /> 
           <a4j:ajax event="valueChange" execute="@this" 
            render="bid_matrices_panel" /> 
          </h:selectOneMenu> 
         </h:form> 
        </rich:panel> 

        <!-- repeatables --> 
        <rich:panel styleClass="contained_width fifty_percent" 
         header="Repeatables"> 
        </rich:panel> 
       </h:panelGrid> 

       <h:form> 
        <!-- we loop on each different commoditization (or however that's spelled) --> 
        <a4j:repeat var="bidmatrix_by_commoditization" 
         value="#{adminBean.bidMatrices}"> 
         <rich:dataTable styleClass="contained_width" 
          value="#{bidmatrix_by_commoditization.bidMatricesByCoreStatus}" 
          var="matrix_by_core_status"> 


          <!-- Display core status --> 
          <rich:column> 
           <f:facet name="header"> 
            <h:outputText 
             value="#{bidmatrix_by_commoditization.commoditization}" /> 
           </f:facet> 
           <h:outputText value="#{matrix_by_core_status.coreStatus}" /> 
          </rich:column> 

          <!-- the percentages --> 
          <c:forEach var="index" begin="0" 
           end="#{adminBean.columnsNumber - 1}"> 
           <rich:column> 
            <f:facet name="header"> 
             <h:outputText value="#{adminBean.columnsHeaders[index]}" /> 
            </f:facet> 
            <h:inputText 
             value="#{matrix_by_core_status.bidMatrices[index].percentage}"> 
             <f:convertNumber type="percent" /> 
            </h:inputText> 
           </rich:column> 
          </c:forEach> 
         </rich:dataTable> 
        </a4j:repeat> 

        <br /> 

        <!-- update matrix button --> 
        <h:commandButton value="Update" action="#{adminBean.update}" /> 
       </h:form> 
     </h:panelGroup> 
    </rich:panel> 

我的豆:

@ManagedBean(name = "adminBean") 
@ViewScoped 
public class AdminBean implements Serializable { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 5917562235108703019L; 

    private CustomerGroupService customerGroupService; 
    private BidMatrixDao bidMatrixDao; 
    private List<BidMatricesByCommoditization> bidMatrices; 

    @PostConstruct 
    public void init() { 
     customerGroupService = new CustomerGroupService(); 
     bidMatrixDao = new BidMatrixDaoImpl(); 
     bidMatrices = bidMatrixDao.getBidMatricesByCustomerGroup(customerGroupService.getDisplayCustomerGroup()); 
    } 

    public void onCustomerGroupChangeListener(ValueChangeEvent v) { 
     customerGroupService.setDisplayCustomerGroup((BigDecimal) v.getNewValue()); 
     bidMatrices = bidMatrixDao.getBidMatricesByCustomerGroup(customerGroupService.getDisplayCustomerGroup()); 
    } 

    public CustomerGroupService getCustomerGroupService() { 
     return customerGroupService; 
    } 

    /** 
    * @param customerGroupService 
    *   the customerGroupService to set 
    */ 
    public void setCustomerGroupService(CustomerGroupService customerGroupService) { 
     this.customerGroupService = customerGroupService; 
    } 

    /** 
    * @return the bidMatrices 
    */ 
    public List<BidMatricesByCommoditization> getBidMatrices() { 
     return bidMatrices; 
    } 

    /** 
    * @param bidMatrices 
    *   the bidMatrices to set 
    */ 
    public void setBidMatrices(List<BidMatricesByCommoditization> bidMatrices) { 
     this.bidMatrices = bidMatrices; 
    } 

    public int getColumnsNumber() { 
     return bidMatrices.get(0).getColumns(); 
    } 

    public List<String> getColumnsHeaders() { 
     return bidMatrixDao.getAlignments(); 
    } 

    public void update() { 
     bidMatrixDao.updateBidMatrices(bidMatrices); 
    } 
} 

注意,我正確導入ViewScoped從javax.faces.bean.ViewScoped; 我也刪除從我的豆的getter/setter方法,但它們的存在。 正如我所說,表單提交時工作正常,但不改變h:selectOneMenu值。

謝謝!

編輯:

<a4j:ajax event="valueChange" execute="@this" render="bid_matrices_panel" /> 

我本來把:我使用JSF 2.2(鑽嘴魚科),RichFaces的4.1,與wildfly 10.1

+0

JSF IMPL和版本? Richfaces版本? – Kukeltje

+0

JSF 2.2是一個API規範,而不是JSF實現和版本。 Wildfly 10.1使用? – Kukeltje

回答

0

我通過移動在我的AJAX指令使用的ID解決了這個ID在父panelGroup中,像這樣:

<h:panelGroup rendered="#{loginBean.isAdmin}" id="bid_matrices_panel"> 

通過創建一個豐富:圍繞其實我是想重新描繪一部分面板,我的問題是固定的:

<h:form> 
    <rich:panel id="bid_matrices_panel"> 
     <! -- my data to render --> 

    </rich:panel> 

    <h:commandButton value="Update" action="#{adminBean.update}" /> 
</h:form> 

我想重新呈現表單是問題的根源。

肯定我之前試過了,但當時我也忘了implements Serializable我AdminBean ...

相關問題