2016-05-15 1 views
3

J'ai une page xhtml avec une session scope backing bean. Maintenant, je dois ouvrir cette page dans un nouvel onglet avec le clic droit ouvrir le lien dans un nouvel onglet. Lorsque cette page s'ouvre, la classe de modèle du bean backing doit être effacée. J'ai utilisé le code suivant:ouvrir une page menuitem dans un nouvel onglet dans primefaces

<p:menuitem value="Details" action="#{beanMB.clearDetailModel()}"/> 

sauvegarde code haricot:

public void clearDetailModel() 
    { 
     memberModel=null; 
     ...... 
     return "/pages/member/MemberDetails.xhtml?faces-redirect=true"; 
    } 

Le code ci-dessus efface le modèle scope de session, mais il ne pas ouvrir la page dans un nouvel onglet.

Existe-t-il une méthode pour ouvrir la page dans un nouvel onglet avec le code ci-dessus ou existe-t-il un moyen alternatif pour le problème ci-dessus? Toute aide serait appréciée. Merci.

+0

Cela n'a pas fonctionné, j'ai besoin d'ouvrir la page avec le clic droit - ouvrir le lien dans un nouvel onglet. La fonction clearDetailModel() est appelée uniquement avec le clic gauche direct mais pas avec le clic droit - ouvrir le lien dans le nouvel onglet. – Kiran

+0

Qu'est-ce que l'usecase? Si vous devez effacer un ** sessioscope ** d modèle lors de l'ouverture d'une page dans un nouvel onglet, vous avez un défaut de conception. Soit introduire un bean viewcoped ou même une portée de fenêtre (basée sur l'extension cdi) – Kukeltje

+0

J'ai utilisé la portée de la session car j'ai besoin d'afficher une image dans le formulaire. Sans portée de session, l'image n'est pas affichée. – Kiran

Répondre

1

Vous pouvez essayer ceci:

Vous devez mettre le code suivant dans la page MemberDetails.xhtml.

<f:metadata> 
<f:event type="preRenderView" listener="#{beanMB.clearDetailModel}"/> 
</f:metadata> 

et d'utiliser url dans menuitem pour ouvrir votre page.

<p:menuitem value="Details" url="/pages/member/MemberDetails.xhtml" /> 

vous devez modifier votre soutien code haricot comme suit:

public void clearDetailModel() 
    { 
     if (isNewRequest()){ 
     memberModel=null; 
     ...... 
     } 

    } 

public boolean isNewRequest() { 
     final FacesContext fc = FacesContext.getCurrentInstance(); 
     final boolean getMethod = ((HttpServletRequest) fc.getExternalContext().getRequest()).getMethod().equals("GET"); 
     final boolean ajaxRequest = fc.getPartialViewContext().isAjaxRequest(); 
     final boolean validationFailed = fc.isValidationFailed(); 
     return getMethod && !ajaxRequest && !validationFailed; 
    } 

Ici méthode isNewRequest() vérifie si la demande est nouvelle ou non, si ce n'est pas vérifié votre méthode clearDetailModel() sera appelé chaque fois qu'une nouvelle demande est faite.