2016-05-15 15 views
0

Meine Seite enthält eine Login-Header, die ich über UI: Include einschließen. Die enthaltene Seite enthält einen Dialog mit einem p: commandButton. Wenn sich der Benutzer anmeldet, wird die Include-Seite entsprechend der @form im Attribut update ordnungsgemäß aktualisiert. Ich möchte auch eine Komponente außerhalb der enthaltenen Seite aktualisieren, die eine Schaltfläche anzeigen soll, wenn der Benutzer angemeldet ist. Die Include-Seite wird aktualisiert und der Name des angemeldeten Benutzers wird angezeigt. Aber der Button auf der Hauptseite wird nicht angezeigt. Es wird angezeigt, wenn ich die Seite jedoch aktualisiere. Ich kann nicht herausfinden, was ich hier falsch mache. Jeder hat irgendwelche Ideen.JSF-Komponente wird nicht von meinem p: commandButton in einem Dialogfeld gerendert in enthaltene Seite

Die Kopfseite zeigt auch die Komponente commandLink ordnungsgemäß an. Wenn Sie jedoch auf den Abmeldelink klicken, wird die Schaltfläche auf der Hauptseite nicht entfernt. Da der BefehlLink keinen AJAX verwendet, gehe ich davon aus, dass ein normaler POST der Seite ausgeführt wird. Welche sollte die ganze Seite neu laden. Funktioniert das nicht von einer Seite, auf die mit ui verwiesen wurde: include?

Die Anmeldeseite verwendet eine Sitzungsbereichs-Backing-Bean. Die Hauptseite ist Ansichtsbereich.

Hier ist der im Lieferumfang enthaltenen xhtml (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> 
... 

Dieser ist in der folgenden Haupt-Seite enthalten:

... 
<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> 

Antwort

0

Ich habe das Problem gefunden. In meinem commandButton "createnew" habe ich den falschen Wert zum Rendern verwendet.

<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> 

Es soll meine Session verwenden scoped Bohne (loginController) zu überprüfen, ob der Benutzer angemeldet ist. In den folgenden Werken ändern.

<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> 

Hinweis der Unterschied gemacht = "# {...} loginController.login statt gerendert =" # {recepieController.loggedIn}“

Die recepieController hat auch ein LoggedIn Attribut, das ich gesetzt , aber da die Seite nicht neu gepostet wird, nehme ich an, dass der Wert für das Attribut nicht geändert wird, wenn ich mich anmelde Ich glaube jedoch, dass ich ajax = "false" im p: commandButton für den Login-Dialog getestet habe sollte die Ansicht beschränkte Version meines Attributs loggedIn zurücksetzen Ich verstehe nicht ganz, warum das nicht funktioniert

1

Sie keine nicht-gerenderte Komponente rerender kann. Wenn Sie eine Schaltfläche teilweise wiedergeben und die Schaltfläche nicht gerendert wird, können Sie für diese Schaltfläche kein Update aufrufen, da sie im DOM nicht vorhanden ist.

Sie müssen das AJAX-Update für den übergeordneten Benennungscontainer aufrufen, der IMMER gerendert wird. Aktualisieren Sie daher die : createform anstatt die Schaltfläche im Inneren. Das Formular wird immer gerendert, egal was passiert.

+0

Hallo Kevkodez. Danke für die Antwort. Ich verweise jedoch auf eine gerenderte Komponente. Die panelGroup namens createbutton wird immer gerendert. Es muss etwas anderes sein. – Pefero