AJAX调用清除不相关控件中的值

时间:2010-02-15 22:21:54

标签: ajax jsf seam richfaces ajax4jsf

我正在使用RichFaces的a4j:支持切换页面上某些控件的可见性。但是,当更改h:selectOneRadio按钮rdoRequestType时,它将清除txtLibraryServerNumber和a4j:outputPanel中ID为“media”的其他控件的值。为什么页面上的一个AJAX调用会干扰不同的AJAX面板?

我尝试在selectOneRadio上的a4j:support标签上使用“process”属性,因此它将其他面板中的文本框的值写入Seam bean,但这没有任何效果。我到底做错了什么?救命!我失去了理智!!

<h:selectOneRadio value="#{webencode.requestType}"
  id="rdoRequestType" styleClass="radio" style="width:295px" layout="pageDirection" >
  <f:selectItem itemValue="program" itemLabel="Series or Individual Program"/>
  <f:selectItem itemValue="promo" itemLabel="Promo" />
  <f:selectItem itemValue="specific" itemLabel="Specific Format Encoding Request"/>
  <a4j:support ajaxSingle="true" event="onclick" reRender="program" process="txtLibraryServerNumber,txtDigitalMediaFileName"/>
</h:selectOneRadio>

<a4j:outputPanel id="program" ajaxRendered="true">
  <s:span rendered="#{('program' == webencode.requestType || 'promo' == webencode.requestType) ? true : false}">
    <h:selectOneMenu value="#{webencode.seriesId}" id="lstSeriesName">
      <f:selectItems value="#{webencode.programItems}"/>
    </h:selectOneMenu>
  </s:span>
  <s:span rendered="#{'specific' == webencode.requestType ? true : false}">
    <h:selectOneMenu value="#{webencode.arrVideoEncodings.get(0).videoEncoding}"
      id="lstSpecificVideoEncoding1" style="width:295px;">
      <f:selectItems value="#{webencode.videoEncodingItems}"/>
    </h:selectOneMenu>
  </s:span>
</a4j:outputPanel>             

<h:selectOneMenu value="#{webencode.inputMediaType}"
  id="lstInputMediaType">
  <f:selectItems value="#{webencode.inputMediaTypeItems}"/>
  <a4j:support ajaxSingle="true" event="onchange" reRender="media" process="lstSeriesName,lstSpecificVideoEncoding1"/>
</h:selectOneMenu>

<a4j:outputPanel id="media" ajaxRendered="true">
  <s:span rendered="#{'Tape Library # or Server ID #' == webencode.inputMediaType ? true : false}">
    <h:inputText id="txtLibraryServerNumber"
      value="#{webencode.libraryServerNumber}" maxlength="50" />
  </s:span>  
  <s:span rendered="#{'Digital Media File Name' == webencode.inputMediaType ? true : false}">
    <h:inputText id="txtDigitalMediaFileName"
      value="#{webencode.digitalMediaFileName}" maxlength="195" /><br />
  </s:span>  
</a4j:outputPanel>

3 个答案:

答案 0 :(得分:1)

如果您将面板的UpdateMode属性设置为“always”,则会在发生任何回发时更新。如果将其设置为“条件”,它将仅在其自身的某个触发器导致回发时更新。

我不知道这是否会清除你的控件,但它可能是为什么一个面板影响另一个面板的答案。

答案 1 :(得分:1)

您的Webencode bean的范围是什么?它必须是Page或更长时间,否则每次通话都会丢失您的值。请记住,如果您未指定范围,则默认为Request,并且每个Ajax调用都是Request。

您的媒体面板始终会被刷新,因为您已使用ajaxRendered属性指定它,就像说“即使我没有被要求重新获得reRendered,也总是reRender我。”除非你有充分的理由使用ajaxRendered(例如总是像状态消息一样呈现的东西),否则你最好从明确指定reRender的内容开始。

此处不需要进程属性 - 摆脱它。

干杯,

d

答案 2 :(得分:0)

找到了解决方案:非常奇怪,但是在使用JBoss运行Apache的服务器上,需要将limitToList属性设置为true:

<a4j:support ajaxSingle="true" event="onchange" reRender="media" 
     limitToList="true"/>

这确保仅重新呈现指示的控件(在这种情况下为“媒体”)。仍然不知道为什么它在服务器上需要而不是在localhost上。需要与Apache有关,以及它如何与JBoss通信,但不确定。