Richfaces: Alterar o valor de atributo 'renderizado' de um componente com A4J: Suporte no ExtendedDatatable
Pergunta
Estou tentando usar Richfaces ExtendedDatatable com A4J: Suporte para alterar o valor do atributo Rich: Painel 'renderizado', mas não está funcionando.
Isso faz parte da minha página JSF que contém um rico: estendidoDatatable e um rico: painel:
<h:form id="tabForm">
<rich:extendedDataTable id="myTable" width="500px" height="250px"
value="#{extDataTableBean.extList}" var="dataRow"
selection="#{extDataTableBean.selection}" selectionMode="single">
<rich:column>
<f:facet name="header"><h:outputText value="ID" /></f:facet>
<h:outputText value="#{dataRow.id}"></h:outputText>
</rich:column>
<rich:column>
<f:facet name="header"><h:outputText value="Name" /></f:facet>
<h:outputText value="#{dataRow.name}"></h:outputText>
</rich:column>
<a4j:support id="myTableTakeSelection" action="#{extDataTableBean.takeSelection}" event="onselectionchange" reRender="pane" />
</rich:extendedDataTable>
</h:form>
<rich:panel id="pane" rendered="#{extDataTableBean.showPane}">
<h:form id="secForm">
<h:outputText value="ID : " />
<h:inputText id="inTextID" value="#{extDataTableBean.idFd}" />
<br/>
<h:outputText value="Name : " />
<h:inputText id="inTextName" value="#{extDataTableBean.nameFd}" />
</h:form>
</rich:panel>
O valor padrão do atributo Rich: Painel 'renderizado' é falso (definido no feijão de apoio). O que eu queria alcançar é quando uma linha no Extended Datatable é selecionada, seu valor é alterado para verdadeiro para que seja visível na GUI.
E isso faz parte do meu feijão de apoio:
/* Constructor */
public ExtDataTableBean(){
setShowPane(false); // default to false
loadDataList();
}
/* Load some test data into extendedDataTable */
public void loadDataList(){
extList = new ArrayList<MyData>();
MyData e1 = new MyData();
e1.setId(1);
e1.setName("name 1");
extList.add(e1);
MyData e2 = new MyData();
e2.setId(2);
e2.setName("name 2");
extList.add(e2);
}
public String takeSelection(){
Iterator iterator = getSelection().getKeys();
Object key = null;
while(iterator.hasNext()){
key = iterator.next();
}
/* set the values of inputText with value from selected row */
setIdFd(extList.get(Integer.parseInt(key.toString())).getId());
setNameFd(extList.get(Integer.parseInt(key.toString())).getName());
setShowPane(true);
return null;
}
public List<MyData> getExtList() {
/* Lazy loading */
if(extList == null){
loadDataList();
}
return extList;
}
No método takeElection (), eu tenho setShowPane (true) para alterar o valor do atributo Rich: Painel 'renderizado' para true. O problema é rico: o painel não é visível na GUI quando uma linha é selecionada.
Fiz outro teste simples adicionando ah: commandbutton com a4j: suporte para definir o showpane como true, assim:
<h:commandButton id="cmdBtn" value="Show Pane">
<a4j:support id="cmdBtnSupport" reRender="pane" action="#{extDataTableBean.dispPane}" event="onclick" />
</h:commandButton>
E no feijão de apoio:
public String dispPane(){
setShowPane(true);
return null;
}
E está funcionando como esperado. Rich: O painel é visível na GUI após o clique.
O que eu perdi no meu código?
Solução
Acho que encontrei a causa do problema deste site:http://community.jboss.org/wiki/commonajaxrequestsproblems#conditionAlrendering
Um extrato da parte que descreveu o problema:
Atualizações do lado do cliente:
O atributo de reprodução não deve ser apontado para elementos renderizados condicionalmente, porque a estrutura não tem idéia de onde adicionar o elemento que não estava no DOM antes. Os pais de tais componentes devem ser renderizados.
Então, depois que modifiquei a peça para ser renderizada e renderizada a vinculação à seguinte, então está funcionando agora:
<rich:panel id="pane" >
<h:form id="secForm" rendered="#{extDataTableBean.showPane}" >
<h:outputText value="ID : " />
<h:inputText id="inTextID" value="#{extDataTableBean.idFd}" />
<br/>
<h:outputText value="Name : " />
<h:inputText id="inTextName" value="#{extDataTableBean.nameFd}" />
</h:form>
</rich:panel>
Outras dicas
<rich:extendedDataTable>
é habilitado para a caixa de Ajax. Não há necessidade de adicionar o <a4j:support>
tag, que se destina a trazer funcionalidade AJAX para componentes JSF não ajax, como <h:inputText>
.
Então, tente isso: em vez disso:
<rich:extendedDataTable onselectionchange="#{extDataTableBean.takeSelection}">
Boa sorte.