2016-05-15 10 views
0

Моя страница содержит заголовок входа, который я включаю через ui: include. Включенная страница содержит диалог с p: commandButton. Когда пользователь входит в систему, страница включения обновляется должным образом в соответствии с @form в атрибуте обновления. Я также хочу обновить компонент за пределами включенной страницы, который должен отображать кнопку, когда пользователь вошел в систему. Отображается страница включения, и отображается имя пользователя, зарегистрированного в системе. Но кнопка на главной странице не отображается. Он отображается, если я обновляю страницу. Я не могу понять, что я здесь делаю неправильно. У кого-нибудь есть идеи.Компонент JSF не отображается из моего p: commandButton in в диалоговом окне, включенном в страницу

На странице заголовка также отображается компонент commandLink правильно. Но при нажатии на ссылку выхода из системы кнопка на главной странице не удаляется. Поскольку commandLink не использует ajax, я предполагаю, что выполняется обычная POST-страница. Который должен перезагрузить всю страницу. Не работает ли эта работа со страницы, на которую ссылаются ui: include?

На странице входа используется компонент, поддерживающий сеанс. На главной странице находится область просмотра.

Вот прилежащий 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> 
... 

Это один входит в следующей главной странице:

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

ответ

0

Я нашел проблему. В моем commandButton «createnew» я использовал неправильное значение для рендеринга.

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

Он должен использовать свой сеанс области действия боб (LoginController), чтобы проверить, если пользователь вошел в систему. Изменение следующих работ.

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

Примечание разница оказывается = "# {...} loginController.login вместо оказанной =" # {} recepieController.loggedIn»

recepieController также имеет атрибут LoggedIn, который я поставил , но поскольку страница не была повторно опубликована, я думаю, что значение не изменяется для атрибута при входе в систему. Однако я считаю, что я тестировал использование ajax = "false" в p: commandButton для диалогового окна входа, который, как мне кажется должен сбрасывать версию моего атрибута loggedIn с расширенным представлением. Я не совсем понимаю, почему это не сработало.

1

Вы не можете засавить не-визуализации компонент. Если вы частично отображаете кнопку, а кнопка не отображается, вы не можете вызывать обновление на этой кнопке, потому что она не существует в DOM.

Вы должны вызвать обновление AJAX в контейнере родительского именования, который отображается ВСЕГДА. Таким образом, обновите : createform, а не кнопку внутри. Форма всегда отображается, несмотря ни на что.

+0

Привет, Kevkodez. Спасибо за ответ. Однако я ссылаюсь на визуализированный компонент. Панель панели, называемая createbutton, всегда отображается. Это должно быть что-то еще. – Pefero