0

我正在使用 RichFaces 的 a4j:support 来切换页面上某些控件的可见性。但是,当 h:selectOneRadio 按钮 rdoRequestType 更改时,它会清除 ID 为“media”的 a4j:outputPanel 中的 txtLibraryServerNumber 和其他控件的值。为什么页面上的一个 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>
4

3 回答 3

1

如果您将面板的 UpdateMode 属性设置为“始终”,它将随着任何回发发生而更新。如果您将其设置为“有条件的”,它只会在它自己的触发器之一导致回发时更新。

我不知道这是否会清除您的控件,但这可能是一个面板影响另一个面板的原因。

于 2010-02-15T22:27:41.943 回答
1

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

当您使用 ajaxRendered 属性指定它时,您的媒体面板始终会被刷新,这就像在说“即使我没有被要求重新渲染,无论如何都要重新渲染我”。除非您有充分的理由使用 ajaxRendered(例如,总是像状态消息一样渲染的东西),否则最好从明确指定要重新渲染的内容开始。

process 属性在这里不是必需的 - 摆脱它。

干杯,

D

于 2010-02-16T00:00:33.287 回答
0

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

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

这确保仅重新渲染指示的控件(在本例中为“媒体”)。仍然不知道为什么在服务器上需要它而不是在本地主机上。必须与 Apache 以及它如何与 JBoss 通信有关,但不确定。

于 2010-02-22T22:39:09.367 回答