Por que meu variável do laço Facelets não vai sair do escopo?
-
16-09-2019 - |
Pergunta
Eu sei que isto parece um monte de texto, mas eu acho que é um conceito simples bastante que eu estou ausente.
Eu estou escrevendo uma aplicação web com Facelets. Eu tenho um rq tag personalizado: request-lista que leva uma lista de pedidos como um parâmetro e gera uma encantadora mesa para exibi-los. Tão longe, tão bom.
rq: pedido para a lista começa como você esperaria:
<!-- ... -->
<ice:dataTable value="#{list}" var="req">
<ice:column>
<f:facet name="header">Date last edited</f:facet>
<ice:outputText value="#{req.dateModified}" />
</ice:column>
<!-- ... -->
E isso acaba bem. Ele ainda tem um link na tabela para editar o pedido. Yippee!
<ice:column rendered="#{spokespersonView}">
<f:facet name="header">Edit</f:facet>
<h:commandLink value="Edit" action="edit_r" rendered="#{RequestSessionBean.mutable}">
<f:setPropertyActionListener target="#{RequestSessionBean.request}" value="#{req}"/>
</h:commandLink>
</ice:column>
Isso nos leva à página de edição, depois de definir o pedido no bean de apoio para a representada pela linha da tabela estamos. Este é onde o problema está. E é sutil.
rq: request-lista é usada várias vezes em uma página; como tal:
<ui:repeat value="#{ExperimentListBean.usersExperiments}" var="exp">
<rq:request-list list="#{RequestListBean.requestsByExperiment[exp]}" showExperiment="false" spokespersonView="true" />
</ui:repeat>
Agora, as tabelas aparecer OK; isto é, todo o texto é certo. No entanto, os commandLinks apontar para os pedidos errados ... eles apontam para a solicitação da linha correspondente do última rq: pedido lista na página. Os dados relativos aos pedidos é emitido como deveria ser na tabela, mas {req} pontos para o pedido errado quando se trata de clicar em um commandLink.
Para reiterar, se eu tenho alguns rq: pedir-listas em uma página, no link Editar para a primeira linha de todas rq: pedido de lista de pontos para o primeiro pedido (linha) em o último rq: pedido lista na página. O link Editar para a segunda linha de cada rq : solicitação de lista de pontos para o segundo pedido (linha) da última RQ: pedido lista na página. Etc.
Como posso obter {req} para apontar para o que eu era, e não apenas ser um índice em uma lista que está desatualizado?
Obrigado!
Solução
Dê uma olhada esta entrada do blog , você provavelmente usa repetição, que é executado uma vez, quando a árvore componente é construir, em vez de foreach que se avaliou a prestação de tempo. (Mas este é apenas um tiro no escuro, eu não tentou o seu exemplo)