2016-05-15 8 views
0

マイページには、ui:include経由でインクルードするログインヘッダーが含まれています。インクルードされたページには、p:commandButtonを持つダイアログが含まれています。ユーザーがログインすると、インクルード・ページは、更新属性の@formに従って適切にリフレッシュされます。私はまた、ユーザがログインしているときにボタンを表示する、インクルードされたページの外側のコンポーネントを更新したいと思う。インクルードページがリフレッシュされ、ログインしたユーザの名前が表示される。しかし、メインページのボタンは表示されません。私はページをリフレッシュすると表示されます。私はここで間違っていることを理解できません。誰でも何か考えがあります。JSFコンポーネントがp:commandButtonからレンダリングされません。

ヘッダーページにはcommandLinkコンポーネントも正しく表示されます。しかし、ログアウトリンクをクリックすると、メインページのボタンは削除されません。 commandLinkはajaxを使用しないので、通常のページPOSTが行われたと仮定します。ページ全体を再読み込みする必要があります。これはui:includeで参照されているページからは機能しませんか?

ログインページでは、セッションスコープのバッキングBeanが使用されています。メインページはビュースコープです。

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

この1は、以下のメインページに含まれている:あなたは非レンダリングコンポーネントを再描画することはできません

... 
<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はまた、IセットLOGGEDIN属性を持ちますしかし、ページが再投稿されていないので、私はログイン時に値が属性のために変更されないと推測します。 しかし、私は推測するログインダイアログのp:commandButtonでajax = "false"私のloggedIn属性のビュースコープバージョンをリセットする必要があります。なぜそれが機能しなかったのか完全に理解していません。

1

はここに含まれ、XHTML(login.xhtml)です。ボタンを部分的にレンダリングしてボタンがレンダリングされない場合、そのボタンはDOMに存在しないため、そのボタンで更新を呼び出すことはできません。

親ネーミングコンテナのAJAX更新を呼び出す必要があります。これは常にレンダリングされています。したがって、内部のボタンではなく:createformを更新してください。フォームはいつでもレンダリングされます。

+0

こんにちはKevkodez。答えをありがとう。しかし、私はレンダリングされたコンポーネントを参照しています。 createbuttonというpanelGroupは常にレンダリングされます。それは他のものでなければならない。 – Pefero

関連する問題