2011-01-11 27 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> 
相关问题