Компонент JSF не отображается из моего p:commandButton в диалоге на включенной странице

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

На странице заголовка также правильно отображается компонент 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>

2 ответа

Решение

Я нашел проблему. В моем 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>

Он должен использовать мой сессионный bean-объект (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>

Обратите внимание на разницу в Rendered="#{loginController.login ...} вместо Rendered =" # {recepieController.loggedIn} "

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

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

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

Другие вопросы по тегам