2016-05-15 2 views
0

Ma page contient un en-tête de connexion que j'inclus via ui: include. La page incluse contient une boîte de dialogue avec un p: commandButton. Lorsque l'utilisateur se connecte, la page d'inclusion est actualisée correctement en fonction du @form dans l'attribut de mise à jour. Je veux également mettre à jour un composant en dehors de la page incluse, qui doit afficher un bouton lorsque l'utilisateur est connecté. La page d'inclusion s'actualise et le nom de l'utilisateur connecté est affiché. Mais le bouton de la page principale n'est pas affiché. Il est affiché si je rafraîchis la page si. Je ne peux pas comprendre ce que je fais mal ici. N'importe qui a des idées.Le composant JSF n'est pas rendu à partir de mon p: commandButton dans une boîte de dialogue de la page incluse

La page d'en-tête affiche également correctement le composant commandLink. Mais lorsque vous cliquez sur le lien de déconnexion, le bouton de la page principale n'est pas supprimé. Comme le commandLink n'utilise pas ajax, je suppose qu'un POST de page normal est fait. Ce qui devrait recharger toute la page. Cela ne fonctionne-t-il pas à partir d'une page qui a été référencée avec ui: include?

La page de connexion utilise un bean backing de portée de session. La page principale est vue étendue.

Voici le xhtml inclus (login.xhtml):

<ui:composition 
    xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:f="http://java.sun.com/jsf/core" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:p="http://primefaces.org/ui" 
     xmlns:c="http://java.sun.com/jsp/jstl/core" 
     xmlns:ui="http://xmlns.jcp.org/jsf/facelets"> 
    <div style="width:100%;font-size:12px;line-height:20px;background-color:#b0d9e6;color:white"> 

<h:form> 
<h:message id="top_msg"></h:message> 
    <h:panelGrid width="100%" columns="3" columnClasses="none,right1,right1"> 
     <h:outputLink rendered="#{!loginController.loggedIn}" styleClass="text-align:right;" value="javascript:void(0)" onclick="PF('dlg').show();" title="login"> 
      <p:outputLabel>Login</p:outputLabel> 
     </h:outputLink> 


    <h:commandLink rendered="#{loginController.loggedIn}" action="#{loginController.logout}" styleClass="text-align:right;" > 
     <h:outputLabel>Logout</h:outputLabel> 
    </h:commandLink> 

    <p:growl id="growl" sticky="true" showDetail="true" life="3000" /> 

    <p:dialog header="Login" widgetVar="dlg" resizable="false"> 
     <h:panelGrid columns="2" cellpadding="5"> 
      <h:outputLabel for="username" value="Username:" /> 
      <p:inputText id="username" value="#{loginController.username}" required="true" label="username" /> 

      <h:outputLabel for="password" value="Password:" /> 
      <p:password id="password" value="#{loginController.password}" required="true" label="password" /> 

      <f:facet name="footer"> 
       <p:commandButton value="Login" 
         update="@form :createform:createbutton" 
         actionListener="#{loginController.login}" 
         oncomplete="handleLoginRequest(xhr, status, args)" > 

       </p:commandButton> 
      </f:facet> 
     </h:panelGrid> 
    </p:dialog> 
    </h:panelGrid> 
<script type="text/javascript"> 
    function handleLoginRequest(xhr, status, args) 


</script> 

</h:form> 

</div> 

</ui:composition> 
... 

Celui-ci est inclus dans la page principale suivante:

... 
<ui:include src="login.xhtml" /> 

    <h:form id="createform"> 
    <h:panelGroup id="createbutton" layout="block"> 

    <p:commandButton id="createnew" 
     ajax="false" 
     action="#{recepieController.createNewRecipes}" 
     value="Create new recipe" 
     rendered="#{recepieController.loggedIn and !recepieController.create and !recepieController.viewOnly and !recepieController.edit}" 
     accesskey="s"> 
     </p:commandButton> 
</h:panelGroup>  
    </h:form> 

Répondre

0

J'ai trouvé le problème. Dans mon commandButton "createnew", j'ai utilisé la mauvaise valeur pour le rendu.

<p:commandButton id="createnew" 
    ajax="false" 
    action="#{recepieController.createNewRecipes}" 
    value="Create new recipe" 
    rendered="#{recepieController.loggedIn and !recepieController.create and !recepieController.viewOnly and !recepieController.edit}" 
    accesskey="s"> 
    </p:commandButton> 

Il devrait utiliser ma session SCOPED haricot (loginController) pour vérifier si l'utilisateur est connecté. Changer les ouvrages suivants.

<h:panelGroup id="createbutton"> 
    <p:commandButton id="createnew" 
     ajax="false" 
     action="#{recepieController.createNewRecipes}" 
     value="Create new recipe" 
     rendered="#{loginController.loggedIn and !recepieController.create and !recepieController.viewOnly and !recepieController.edit}" 
     accesskey="s"> 
     </p:commandButton> 
    </h:panelGroup> 

Notez la différence rendu = "# {...} loginController.login au lieu de rendu =" # {recepieController.loggedIn} »

Le recepieController a aussi un attribut loggedIn que je reproduis , mais puisque la page n'est pas re-postée je suppose que la valeur n'est pas changée pour l'attribut quand je me connecte Cependant, je crois que j'ai testé pour utiliser ajax = "false" dans le p: commandButton pour la boîte de dialogue de connexion que je suppose devrait réinitialiser la version portée de vue de mon attribut connecté.Je ne comprends pas entièrement pourquoi cela n'a pas fonctionné

1

Vous ne pouvez pas rerender un composant non rendu. Si vous affichez partiellement un bouton et que le bouton n'est pas rendu, vous ne pouvez pas appeler de mise à jour sur ce bouton, car il n'existe pas dans le DOM.

Vous devez appeler la mise à jour AJAX sur le conteneur d'attribution de noms parent, qui est TOUJOURS rendu. Ainsi, mettez à jour le : createform plutôt que le bouton à l'intérieur. Le formulaire est toujours rendu, peu importe quoi.

+0

Bonjour Kevkodez. Merci d'avoir répondu. Cependant je fais référence à un composant rendu. Le panelGroup appelé createbutton est toujours rendu. Ça doit être autre chose. – Pefero