【问题标题】:AJAX call clears values in unrelated controlsAJAX 调用清除无关控件中的值
【发布时间】:2010-02-15 22:21:54
【问题描述】:

我正在使用 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>

【问题讨论】:

    标签: ajax jsf seam richfaces ajax4jsf


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,hqrsie。不幸的是,RichFaces a4j:outputPanel 控件上没有 UpdateMode。
    【解决方案2】:

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

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

    这里不需要 process 属性 - 去掉它。

    干杯,

    D

    【讨论】:

    • 谢谢,达摩。我从输出面板中删除了 ajaxRendered 属性。它们现在在我的本地主机上正常工作;但是在服务器上,运行相同版本的 JBoss,AJAX 现在什么都不做。很奇怪。
    • 检查您没有任何嵌套表单。如果您使用 Facelets,很容易发生意外。
    • 我以前见过这个问题:似乎如果您在页面上有必填字段,并且设置了ajaxRendered=false,则面板不会显示。我可以让面板显示的唯一方法是将其设置为 true,当我这样做时,它会清除另一个面板中字段的值。
    • 不。没有嵌套表格。刚刚检查了浏览器的视图源。只有一个表单标签。
    • @Alex 如果你不使用 ajaxRendered 属性,它默认为 false。我很难相信它会导致您看到的效果。
    【解决方案3】:

    找到解决办法:很奇怪,但是在运行带有JBoss的Apache的服务器上,它需要将limitToList属性设置为true:

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

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

    【讨论】:

      猜你喜欢
      • 2011-11-04
      • 2012-06-30
      • 1970-01-01
      • 1970-01-01
      • 2011-05-02
      • 1970-01-01
      • 2011-08-18
      • 2012-01-09
      • 1970-01-01
      相关资源
      最近更新 更多