Pergunta

Estou usando o A4J: Suporte de Richfaces para alternar a visibilidade de alguns controles na página. No entanto, quando o botão H: SelectONeradio RDoreQuestType é alterado, ele limpa os valores do txtLibraryServerNumber e outros controles no A4J: OutputPanel com ID "Media". Por que uma chamada Ajax em uma página interferiria em um painel Ajax diferente?

Eu tentei usar o atributo "Process" na tag A4J: Suporte no SelectONeradio, para que ele grava os valores das caixas de texto no outro painel no Bean, mas isso não tem efeito. O que diabos estou fazendo de errado? Ajuda! Estou enlouquecendo!!

<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>
Foi útil?

Solução 3

Encontrou a solução: muito estranha, mas no servidor, que está executando o Apache com o JBoss, ele precisa ter o atributo limitolista definido como true:

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

Isso garante que apenas o controle indicado (neste caso "mídia") seja renderizado novamente. Ainda não sei por que é necessário no servidor, mas não no host local. Tenho que ser algo com o Apache e como ele se comunica com o JBoss, mas não tenho certeza.

Outras dicas

Se você tiver a propriedade UpdateMode do painel definida como "sempre", ele será atualizado com qualquer postback. Se você o definir como "condicional", ele será atualizado apenas quando um dos seus gatilhos causar um postback.

Não sei se isso limparia seus controles, mas é uma resposta possível para o motivo pelo qual um painel está afetando outro.

Qual é o escopo do seu Bean WebEncode? Ele terá que ser página ou mais ou seus valores serão perdidos a cada chamada. Lembre -se de que, se você não especificar um escopo, o padrão é solicitar e cada chamada AJAX é uma solicitação.

Seu painel de mídia está sempre sendo revigorado, pois você o especificou com o atributo Ajaxrenderd, que é como dizer "mesmo que não seja solicitado a ser reproduzido, novamente me renderia sempre de qualquer maneira". A menos que você tenha um bom motivo para usar o Ajaxrenderd (por exemplo, algo que sempre é renderizado como mensagens de status), é melhor começar com a explicidade especificando o que renderia.

O atributo do processo não é necessário aqui - livre -se dele.

Saúde,

D

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top