JSF 2.0:Preservar o estado do componente através de múltiplos pontos de vista

StackOverflow https://stackoverflow.com/questions/4605785

  •  25-09-2019
  •  | 
  •  

Pergunta

O aplicativo da web que estou a desenvolver usando o MyFaces 2.0.3 / PrimeFaces 2.2RC2 é dividido em um conteúdo e uma área de navegação.Na área de navegação, que está incluído em várias páginas usando o template (i.e. <ui:define>), existem alguns widgets (por exemplo,uma árvore de navegação, desmontável, painéis, etc.) do que eu quero preservar o estado do componente através de pontos de vista.

Por exemplo, vamos dizer que eu estou na página inicial.Quando eu navegar para uma página de detalhes do produto ao clicar em um produto na árvore de navegação, o meu código Java dispara um redirecionamento usando

navigationHandler.handleNavigation(context, null,
  "/detailspage.jsf?faces-redirect=true")

Outra forma de obter página de detalhes seria clicando diretamente sobre um produto teaser do que é mostrado na página inicial.O correspondente <h:link> levar-nos-ia para a página de detalhes.

Em ambos os casos, a expansão de estado da minha árvore de navegação (uma PrimeFaces árvore de componentes) e a minha dobrável painéis é perdida.Eu entendo que isso é porque o redirecionamento / h:link resulta na criação de um novo modo de exibição.

Qual é a melhor maneira de lidar com isso?Eu já estou usando MyFaces Orquestra no meu projeto, juntamente com a sua conversa de escopo, mas eu não tenho certeza se isso é de alguma ajuda aqui (desde que eu gostaria de vincular a expansão/estado recolhido de widgets para um backing bean...mas até onde eu sei, isso não é possível).Existe uma maneira de dizer JSF que o estado dos componentes para propagar para a vista seguinte, supondo que o mesmo componente existe esse ponto de vista?

Eu acho que eu poderia precisar de um ponteiro para a direção certa aqui.Obrigado!


Atualização 1: Eu apenas tentei ligação a painéis e a árvore para um escopo session bean, mas isso parece não ter nenhum efeito.Também, eu acho que eu teria que ligar todos os componentes filhos (se houver) manualmente, de modo que este não parece ser o caminho a percorrer.

Atualização 2: Vinculação de componentes de INTERFACE do usuário a não-solicitação de escopo de feijão não é uma boa idéia (veja o link que eu postei no comentário abaixo).Se não há abordagem mais fácil, eu poderia proceder da seguinte maneira:

  • Quando o painel está minimizado ou a árvore é expandida, salvar o estado atual em um escopo de sessão backing bean (!= o componente de INTERFACE do usuário em si)
  • Os estados dos componentes são armazenados em um mapa.O mapa principal é o componente (espero) exclusivo, relativo ID.Eu não posso usar o todo absoluto componente caminho aqui, pois os IDs do pai recipientes de nomenclatura podem alterar-se as alterações de vista, partindo do princípio que estes IDs são gerados por meio de programação.
  • Assim que um novo modo de exibição é construída, recuperar os estados dos componentes do mapa e aplicá-los para os componentes.Por exemplo, no caso dos painéis, que eu possa definir o collapsed atributo para um valor obtido a partir do meu escopo de sessão backing bean.

Atualização 3: Eu tenho que trabalhar, como descrito acima.Para resumir, a solução é armazenar as propriedades relevantes em um escopo session bean em vez de fazer toda a UIComponent escopo de sessão.Em seguida, quando o componente é re-construída depois de a navegação ter ocorrido, defina os valores de atributo, recuperando as propriedades salvas (usando EL), por exemplo,

<p:panel collapsed="#{backingBean.collapsedState}" ... />

(Este é um exemplo simplificado.Desde que eu estou usando vários painéis, eu estou usando um mapa para armazenar essas propriedades, como descrito acima).

Foi útil?

Solução

Uma solução seria a utilização de escopo de sessão de feijão.

Outras dicas

O que você quer dizer por dobrável painéis?Eu pergunto porque existe um componente que é closable bem como um componente.Eu estou usando no painel de navegação do meu projeto.O accordianPanel tem um atributo chamado "activeIndex".Aqui está o que eu fiz na minha sessionBean para manter o estado do meu acordeão guias:

 private int tabIndex; //declared a private variable

    public SessionBean() {
       tabIndex = 100; //set the initial tab index to 100 so all tabs are closed when page loads.
    }

    public int getTabIndex(){
       return tabIndex;
    }

    public void setTabIndex(int tabIndex){
       this.tabIndex=tabIndex;
    }

in my navigation pane:



<p:accordionPanel activeIndex="#{sessionBean.tabIndex}" collapsible="true" autoHeight="false">
    <p:tab title="#{tab1_title}">
       <h:commandLink value="link here" action="target_page?faces-redirect=true" /><br/>
    </p:tab>
    <p:tab title="#{tab2_title}">
       <h:commandLink value="link here" action="target_page?faces-redirect=true" />
    </p:tab>
    <p:tab title="#{tab3_title}">
       <h:commandLink value="link here" action="target_page?faces-redirect=true" />
    </p:tab>
 </p:accordionPanel>

Eu não estou usando a árvore de componentes para a navegação como a que apresentei meu projeto com algumas dificuldades, que foram superadas facilmente usando o accordionPanel, então eu não posso falar para que parte de sua navegação.

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