2015-04-08 1 views
1

J'utilise un Bean (MenuBean) pour créer dynamiquement uneharicot clair SessionScoped quand la page rafraîchissante

<p:breadCrumb model="#{menuBean.model}" /> 

Lors de la transition à travers chaque page de mon application, je pousse ou pages pop à partir d'une « pile de page », donc pour adapter le breadCrumb de chaque page.

@ManagedBean 
@SessionScoped 
public class MenuBean implements Serializable { 

private MenuModel model; 
private int navIdx; 
private ArrayList<String[]> pageStack; 

@PostConstruct 
public void init() { 
    pageStack = new ArrayList<>(); 
    navIdx = 0; 
    String [] home = new String[2]; 
    home[0] = "Home"; 
    home[1] = "home.xhtml";  
    pageStack.add(home); 

    refreshModel(); 
} 

private void refreshModel() { 
    model = new DefaultMenuModel(); 
    int i = 0; 
    for(String[] s: pageStack) { 
     DefaultMenuItem index = new DefaultMenuItem(); 
     index.setValue(s[0]); 
     index.setCommand("#{menuBean.navigate}"); 
     index.setParam("index", String.valueOf(i++)); 
     model.addElement(index);    
    } 
} 

private void push(String [] page) { 
    pageStack.add(page);     
    navIdx++; 
    refreshModel(); 
} 

private String pop() { 
    pageStack.remove(navIdx--);  
    String[] prevPage = pageStack.get(navIdx); 
    refreshModel(); 

    return prevPage[1]; 
} 

} 

Afin de maintenir cette pile, mon MenuBean est SessionScoped.
Cependant, lorsque j'actualise la dernière page par exemple, la page initiale est affichée (puisque l'url ne change pas) mais le breadCrumb affiche toujours la pile entière.

Ma question est: Y at-il un moyen d'effacer le MenuBean lorsque l'utilisateur quitte la page, ou l'actualise?

Répondre

2

Une façon d'actualiser le bean consiste à utiliser remoteCommand avec set auto run sur true. Donc, une fois que vous aurez actualisé la page, la commade distante se déclenchera et appellera la méthode dans le bean backing.

<!-- init bean on page load --> 
<h:form id="initializePageDataForm"> 
    <p:remoteCommand name="initializePageDataCommand" autoRun="true" action="#{MenuBean.init()}" /> 
</h:form> 
+0

Merci, cela a fonctionné pour moi. Je devais aussi ajouter un 'update =" breadCrumb "' pour l'actualiser, mais le 'autoRun' était ce que je cherchais. – parakmiakos

+0

@parakmiakos: vous ne pouviez pas utiliser un événement prerenderview? – Kukeltje

+0

@Kukeltje Pourriez-vous élaborer? : D – parakmiakos