A chamada Ajax limpa os valores em controles não relacionados
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>
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