2012-02-03 60 views
1

我建立的發票應用。當用戶選擇客戶端時,與客戶端關聯的服務將通過ajax事件在dataTable中重新呈現。但是,dataTable中selectOneMenu的ajax事件不會觸發。AJAX事件是由另一AJAX事件重新呈現不執行

這是讓用戶選擇的客戶機的形式:

<h:form> 
    <h:selectOneMenu id="clientSelect" value="#{invoiceBean.client}"> 
     <f:ajax execute="clientSelect" listener="#{invoiceServiceListener.processClientValueChange}" render=":test :invoiceData"/> 
     <f:selectItems value="#{invoiceBean.clientOptions}"/> 
    </h:selectOneMenu> 
</h:form> 

這將觸發其填充在invoiceBean服務陣列和重新呈現顯示所述服務在另一個selectOneMenu用於數據表的AJAX事件在dataTable中。這部分工作正常。

這是通過上述形式選擇所述客戶端之後被重新呈現的數據表:本selectOneMenu用於被適當地填充

<h:panelGroup id="test"> 
    <h:dataTable id="invoiceData" value="#{attributes.priceAttributes}" var="loop"> 
     <h:column> 
      <ui:param name="service" value="service#{loop}" /> 
      <ui:param name="description" value="description#{loop}" /> 
      <ui:param name="price" value="price#{loop}" /> 
      <h:form id="invoiceSelectMenu"> 
       <h:selectOneMenu id="selectMenu" value="#{invoiceBean[service]}"> 
        <f:ajax event="change" execute="selectMenu" listener="#{invoiceServiceListener.procesServiceValueChange}" render="@form" /> 
        <f:attribute name="row" value="#{loop}" /> 
        <f:selectItems value="#{invoiceBean.services}" /> 
       </h:selectOneMenu> 
       <h:inputText id="description" value="#{invoiceBean[description]}" /> 
       <h:inputText id="price" value="#{invoiceBean[price]}" /> 
       <h:outputText value="#{loop}" /> 
      </h:form> 
     </h:column> 
    </h:dataTable> 
</h:panelGroup> 

。但是,在選擇一個菜單中的ajax事件在通過第一種形式重新呈現後不起作用。但是,如果我手動填充服務數組而未提交第一個表單,那麼這個ajax事件正常執行。順便說一下,這個ajax事件也爲描述和價格輸入字段設置了一個值,這些字段在事件發生時應該重新呈現。 invoiceBean是請求作用域。

+0

你爲什麼不閱讀該郵件通過'['和']'格式化替換所有'<' and '>之前編輯的幫規'? – BalusC 2012-02-03 19:50:12

+0

如果您有DOM元素的事件處理程序並將其替換爲AJAX內容,則不再附加事件。這是問題嗎? – 2012-02-06 17:26:02

+0

對不起,我不熟悉這個DOM術語。你能詳細說明一下嗎?我如何解決這個問題?如果您有關於此事的鏈接,請分享。我很好的自己閱讀,當我在谷歌搜索時,我無法找到一個有用的鏈接。謝謝。 – 2012-02-06 17:35:26

回答

2

這將是棘手的。由於JSF spec issue 790,當你重新渲染使用<f:ajax>另一<h:form>一些內容,那麼它的視圖狀態會迷路。爲了解決這個問題,你基本上需要引用內部<f:ajax>而不是某些成分含有的另一<h:form>完整的客戶端ID。但是您基本上有多個表單,其中<h:dataTable>不能被絕對客戶端ID引用。

你需要重新排列代碼把<h:dataTable><h:form>,改變<f:ajax>execute只有必要的組件。

<h:form id="invoiceDataForm"> 
    <h:dataTable id="invoiceData" value="#{attributes.priceAttributes}" var="loop"> 
     <h:column> 
      <ui:param name="service" value="service#{loop}" /> 
      <ui:param name="description" value="description#{loop}" /> 
      <ui:param name="price" value="price#{loop}" /> 
      <h:selectOneMenu id="selectMenu" value="#{invoiceBean[service]}"> 
       <f:ajax execute="selectMenu,description,price" listener="#{invoiceServiceListener.procesServiceValueChange}" render="@form" /> 
       <f:attribute name="row" value="#{loop}" /> 
       <f:selectItems value="#{invoiceBean.services}" /> 
      </h:selectOneMenu> 
      <h:inputText id="description" value="#{invoiceBean[description]}" /> 
      <h:inputText id="price" value="#{invoiceBean[price]}" /> 
      <h:outputText value="#{loop}" /> 
     </h:column> 
    </h:dataTable> 
</h:panelGroup> 

,然後引用它形成第一形式,如下所示:在組件庫特定Ajax引擎

<f:ajax execute="clientSelect" listener="#{invoiceServiceListener.processClientValueChange}" render=":invoiceDataForm" /> 

注意,如PrimeFaces一些組件庫已經workarounded /解決了這個。所以,如果它可能發生,你已經在使用PrimeFaces,您還可以通過<p:ajax>代替第一種形式的<f:ajax>


無關到具體問題,<f:attribute name="row" value="#{loop}" />可能不是你所期望它做什麼。它將設置null,因爲<f:xxx>標籤在視圖生成時間期間運行,而不是在視圖渲染時間標籤期間運行。在查看構建時間期間,#{loop}不可用。但是,這對於受一個不同的問題:)

+0

謝謝BalusC先生。如果你碰巧讀到這個,我應該用什麼標籤代替發送param到ajax事件?如果問題已經被問到,如果你有鏈接,我可以自己閱讀。 – 2012-02-07 12:25:12

+0

嘿,我有另一個問題,與此有關。當我將渲染更改爲「描述價格」時,它不再起作用。它只適用於@form,爲什麼? – 2012-02-07 16:51:11