Исчезают древовидные основные элементы узла

Я разрабатываю приложение с Primefaces в Liferay, мне нужно использовать p:treeTable compenent, случается, что узлы исчезают при нажатии на p:commandButton. Я верю, что это имеет отношение к ajax, если поместить код в managedBean в @PostConstruct, он работает нормально

Это мой.xhtml

<h:body>
        <h:form id="form">
            <p:layout style="min-width:1050px;height:700px" styleClass="semBorda">
                <p:layoutUnit position="west" size="900" minSize="40" maxSize="310"
                    styleClass="semBorda">

                    <p:panelGrid columns="2" style="width:300px">
                        <f:facet name="header">
                            <h:outputText value="Campos" />
                        </f:facet>

                        <h:outputText value="Cidade" />
                        <p:selectCheckboxMenu value="#{relatorioBean.selectedCidades}"
                            label="Cidades" filter="true">
                            <f:selectItems value="#{relatorioBean.cidades}" />
                        </p:selectCheckboxMenu>

                        <!--                            <h:outputText value="Ramal" /> -->
                        <!--                            <p:selectBooleanCheckbox value="" /> -->

                        <!--                            <h:outputText value="Tipo de Ramal" /> -->
                        <!--                            <p:selectBooleanCheckbox value="" /> -->

                        <!--                            <h:outputText value="Suborgao" /> -->
                        <!--                            <p:selectBooleanCheckbox value="" /> -->

                        <!--                            <h:outputText value="Situação" /> -->
                        <!--                            <p:selectBooleanCheckbox value="" /> -->

                        <h:outputText value="Polo" />
                        <p:selectBooleanCheckbox value="#{relatorioBean.polo}" />

                        <!--                            <h:outputText value="Categoria Diurna" /> -->
                        <!--                            <p:selectBooleanCheckbox value="" /> -->

                        <!--                            <h:outputText value="Categoria Noturna" /> -->
                        <!--                            <p:selectBooleanCheckbox value="" /> -->

                        <h:outputText value="Teste" />
                        <p:inputText value="#{relatorioBean.teste}" />
                    </p:panelGrid>


                    <p:panelGrid columns="1" style="margin-left:200px; margin-top:10px">

                        <p:commandButton actionListener="#{relatorioBean.montarRaiz}"
                            value="Consultar" update="tree" styleClass="semB"  />


                    </p:panelGrid>


                </p:layoutUnit>

                <p:layoutUnit position="center" styleClass="">

                    <p:treeTable value="#{relatorioBean.raiz}" var="ramal" id="tree">

                        <p:column headerText="Name">
                            <h:outputText value="#{ramal}" />
                        </p:column>


                    </p:treeTable>

                </p:layoutUnit>
            </p:layout>
        </h:form>

    </h:body>

Мой управляемый Бин

package br.jus.tjpe.infosistelecom.controle;

import br.jus.tjpe.infosistelecom.dao.OrgaoDao;
import br.jus.tjpe.infosistelecom.dao.RamalDao;
import br.jus.tjpe.infosistelecom.factory.OrgaoDaoFactory;
import br.jus.tjpe.infosistelecom.factory.RamalDaoFactory;
import br.jus.tjpe.infosistelecom.modelo.Ramal;

import java.io.Serializable;
import java.util.ArrayList;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.bean.ViewScoped;
import javax.faces.event.ActionEvent;

import org.primefaces.event.NodeCollapseEvent;
import org.primefaces.event.NodeExpandEvent;
import org.primefaces.model.DefaultTreeNode;
import org.primefaces.model.TreeNode;

@ManagedBean
@RequestScoped
public class RelatorioBean implements Serializable {

    private ArrayList<Ramal> ramais;
    private ArrayList<String> cidades;
    private String[] selectedCidades;
    private TreeNode root = new DefaultTreeNode("Root Node", null);; 
    private boolean polo;
    private String teste;

    public String getTeste() {
        return teste;
    }

    public void setTeste(String teste) {
        this.teste = teste;
    }

    public boolean getPolo() {
        return polo;
    }

    public void setPolo(boolean polo) {
        this.polo = polo;
    }

    public String[] getSelectedCidades() {
        return selectedCidades;
    }

    public void setSelectedCidades(String[] selectedCidades) {
        this.selectedCidades = selectedCidades;
    }

    public ArrayList<String> getCidades() {
        return cidades;
    }

    public void setCidades(ArrayList<String> cidades) {
        this.cidades = cidades;
    }

    public TreeNode getRaiz() {
        return root;
    }

    public void setRaiz(TreeNode raiz) {
        this.root = raiz;
    }

    public ArrayList<Ramal> getRamais() {
        return ramais;
    }

    public void setRamais(ArrayList<Ramal> ramais) {
        this.ramais = ramais;
    }

    @PostConstruct
    public void init() {

        cidades = new ArrayList<String>();
        OrgaoDao daoOrgao = OrgaoDaoFactory.createOrgaoDao();
        cidades = daoOrgao.listarCidades();

//      ramais = new ArrayList<Ramal>();
//      RamalDao daoRamal = RamalDaoFactory.createRamalDao();
//      ramais = daoRamal.listarTudo();

//      DefaultTreeNode no = new DefaultTreeNode("hgshdgs", this.root);
//      DefaultTreeNode no1 = new DefaultTreeNode("hgssdsdshdgs", this.root);
//      DefaultTreeNode no2 = new DefaultTreeNode("hgshdnjhsdghjdagjhggs", no1);
//      DefaultTreeNode no3 = new DefaultTreeNode("hgshdnjhsdghjdagjhggs", this.root);
//      DefaultTreeNode no24= new DefaultTreeNode("hgshdnjhsdghjdagjhggs", no3);



    }

    public void montarRaiz() {

        //System.out.println("diuyfuidyfuidyfuidy");

//      root = new DefaultTreeNode("Root Node", null);
//      ramais = new ArrayList<Ramal>();
//      RamalDao daoRamal = RamalDaoFactory.createRamalDao();
//      ramais = daoRamal.listarTudo();


//      DefaultTreeNode no = new DefaultTreeNode(ramais.get(0), raiz); 
//      DefaultTreeNode no1 = new DefaultTreeNode(ramais.get(1), raiz); 
//      
//      for (Ramal ramal : ramais) {
//          
//          new DefaultTreeNode(ramal, this.root);
//          
//      }
//  
        DefaultTreeNode no = new DefaultTreeNode("hgshdgs", this.root);
        DefaultTreeNode no1 = new DefaultTreeNode("hgssdsdshdgs", this.root);
        DefaultTreeNode no2 = new DefaultTreeNode("hgshdnjhsdghjdagjhggs", no1);
        DefaultTreeNode no3 = new DefaultTreeNode("hgshdnjhsdghjdagjhggs", this.root);
        DefaultTreeNode no24= new DefaultTreeNode("hgshdnjhsdghjdagjhggs", no3);


//      System.out.println(selectedCidades[0]);
//      System.out.println(selectedCidades[1]);


    }

}

Я пытался решить это, но безуспешно.

1 ответ

Решение

Попробуйте изменить область действия вашего ManagedBean на @ViewScoped (BalusC обсуждает области видимости) Поскольку этот бин в настоящее время определен как @RequestScoped, новый экземпляр будет создан и уничтожен с каждым запросом. Я просто догадываюсь здесь, но когда ваш commandButton отправляет POST через ajax, JSF понимает, что он должен перестроить ManagedBean во время фазы "RESTORE_VIEW", но это как-то фактически не вызывает конструктор, потому что он обрабатывает запрос ajax. Тем не менее, из того, что вы нашли, JSF должен позвонить @PostConstruct методы во время этой фазы "RESTORE_VIEW" независимо от того, является ли запрос ajax или нет.

Другими словами, treeTable исчезает со страницы, потому что он не существует на стороне сервера в то время.

Другие вопросы по тегам