2011-01-11 30 views
2

我碰到了牆。 我知道a4j和豐富的標籤非常好(我使用Seam 2.2.0和Richfaces 3.3.1)。但是,我試圖做一些非常簡單的事情,但在豐富的:modalPanel中。a4j:內部支持:modalPanel

似乎rich:modalPanels不允許觸發Ajax事件。這裏有一個簡單的故障: 我有一個h:selectOneMenu,其中有一些項目,其值被附加到一個支持bean。附加到h:selectOneMenu是一個a4j:支持標籤,因此無論何時觸發change事件,輔助bean都應該被更新。真的很簡單的東西呃?

但是,當這個h:selectOneMenu在rich:modalPanel中時,onchange事件不會更新輔助bean,直到rich:modalPanel關閉。

我可以證實這一點,因爲我在Eclipse調試模式下運行它,並且在h:selectOneMenu上連接的屬性的setter上有一個斷點。 這讓我生氣!這是Ajax的香草,但富有:modalPanels似乎不允許它。

所以,問題是:我可以在一個豐富的:modalPanel內做Ajax的東西嗎?我基本上試圖使用rich:modalPanel作爲窗體(我試過a4j:form和h:form無濟於事),它會對下拉列表的變化做出反應(例如,當用戶更改下拉列表時,部分表單應該被重新修改)。我想做一些不可能的事嗎?

這裏的modalPanel的簡化版本:

<rich:modalPanel id="quickAddPanel"> 
    <div> 
     <a4j:form id="quickAddPaymentForm" ajaxSubmit="true"> 
       <s:decorate id="paymentTypeDecorator"> 
        <a4j:region> 
         <h:selectOneMenu 
          id="paymentType" 
          required="true" 
          value="#{backingBean.paymentType}" 
          tabindex="1"> 
          <s:selectItems 
           label="#{type.description}" 
           noSelectionLabel="Please select..." 
           value="#{incomingPaymentTypes}" 
           var="type"/> 
          <s:convertEnum/> 
          <a4j:support 
           ajaxSingle="true" 
           event="onchange" 
           eventsQueue="paymentQueue" 
           immediate="true" 
           limitToList="true" 
           reRender="paymentTypeDecorator, paymentDetailsOutputPanel, quickAddPaymentForm"/> 
         </h:selectOneMenu> 
        </a4j:region> 
       </s:decorate> 
      </fieldset> 

      <fieldset class="standard-form"> 
       <div class="form-title">Payment details</div> 
       <a4j:outputPanel id="paymentDetailsOutputPanel"> 
        <h:outputText value="This should change whenever dropdown changes: #{backingBean.paymentType}"/> 
       </a4j:outputPanel> 
      </fieldset> 
     </a4j:form> 
    </div> 
</rich:modalPanel> 

問候, 安迪

+0

是什麼動作由a4j調用:支持onchange事件?如果是,那麼你有沒有確認該行動被稱爲? – niksvp 2011-01-11 09:52:50

+0

不是。這是一個簡單的a4j:support event ='onchange'綁定,確保當下拉改變時,綁定的支持bean值將得到更新。它確實得到更新,但只有在模式面板關閉後。如果它不在模式面板中,則每次更改下拉值時都會更新bean。 – 2011-01-11 10:01:47

回答

1

它應該工作。使用a4j:log從服務器發送更新的標記(您重新呈現的)。我不相信它會導致問題,但是您可以在代碼中更改一些內容:

ajaxSubmit = true - 當您使用a4j時,您並不需要它:支持 ajaxSingle = true和a4j:region - 在你的情況下是一樣的 limitToList = true - 你不需要它,因爲你不更新頁面上的任何其他區域。

0

嘗試採取表格modalPanel標籤之外:

<a4j:form id="quickAddPaymentForm" ajaxSubmit="true"> 
    <rich:modalPanel id="quickAddPanel"> 
     <div> 

還請確保您的 「quickAddPaymentForm」 不是嵌套

3

使用<h:form>

和刪除以下屬性:ajaxSingle =「真「,immediate =」true「

0

檢查由f生成的HTML選項:selectItems或s:selectItems不包含尾隨空格(vie從瀏覽器W¯¯頁面源):

<select> 
    <option value="0 ">Select One </option> 
    <option value="id1 ">Choice 1 </option> 
    <option value="id2 ">Choice 2 </option> 
    <option value="id3 ">Choice 3 </option> 
</select> 

如果是的話,刪除服務器端代碼尾隨空格,

<select> 
    <option value="0">Select One</option> 
    <option value="id1">Choice 1</option> 
    <option value="id2">Choice 2</option> 
    <option value="id3">Choice 3</option> 
</select> 

我發現後面的空格防止AJAX事件從射擊時A4J:支持和h:selectOneMenu在rich:modalPanel中工作,即使它在rich:modalPanel之外工作正常。這裏是一個有效的示例代碼:

<h:form> 
<rich:modalPanel id="myPanel" autosized="true" width="700" showWhenRendered="true"> 
    <table cellpadding="4" cellspacing="2" align="center" width="100%"> 
    <tr> 
    <td align="left"> 
     <h:selectOneMenu styleClass="dropdown" id="dropdownList" 
      value="#{backbean.currentChoice}" 
      valueChangeListener="#{backbean.choiceChanged}" > 
      <f:selectItems value="#{backbean.choiceItems}"></f:selectItems> 
      <a4j:support event="onchange" reRender="whatPicked" ajaxSingle="true" /> 
      </h:selectOneMenu> 
     </td> 
    </tr> 
    <tr> 
     <td> 
     <a4j:outputPanel id="whatPicked"> 
      <h:outputText value="#{backbean.currentChoice }"></h:outputText> 
     </a4j:outputPanel> 
     </td> 
    </tr> 
    </table> 
</rich:modalPanel> 
</h:form> 
相關問題