0

logOutButton をクリックすると、ajaxR 要素も再レンダリングされているように見えます。f:ajax render 属性にある ID のみを再レンダリングすることを期待しています。または、ページ全体を再レンダリングしている可能性があります。問題は、指定した ID だけでなく、なぜ ajaxR 要素やページ全体をレンダリングするのかということです。

明確にするために、ログアウトボタンをクリックすると、render="#{userIdBean.isLoggedIn}" が原因で ajaxR 要素がレンダリングされません。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="en"
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:c="http://java.sun.com/jsp/jstl/core"
>
<h:head>
    <title>SandBox</title>
</h:head>
<h:body>

    <h1>SandBox</h1>    
    <h:form id="form1">

        Registration:<br></br>
        Email: <h:inputText value="#{regBean.email}"></h:inputText><br></br>
        User Id: <h:inputText value="#{regBean.userId}"></h:inputText><br></br>
        Password: <h:inputText id="passR" value="#{regBean.password}"></h:inputText><br></br>

        <h:outputText rendered="#{userIdBean.isLoggedIn}" id="nodeL" value="Good Luck: #{userIdBean.userId}" style="font-weight:bold" /><br></br>

        <h:commandButton value="Submit" type="submit" action="#{regBean.storeUserId}" />
        <h:commandButton id="logOutButton" rendered="#{userIdBean.isLoggedIn}" value="Log Out" type="submit" action="#{loginBean.logoutUser}" >
            <f:ajax event="keyup" render="nodeL logOutButton"/>
        </h:commandButton>
        <br></br>

    <h:outputText rendered="#{userIdBean.isLoggedIn}" value="AJAX Response: #{userIdBean.userId}"></h:outputText>

    </h:form>
</h:body>
</html>

これは、Bean コードのスニペットです。

public String logoutUser(){
        userIdBean.setIsLoggedIn(false);
        userIdBean.setUserId(null);
        return null;
    }
4

2 に答える 2

1

コードに 2 つの誤りがあります。

  1. コンポーネント<f:ajax event>内のはに設定する必要があります。属性を完全にそのままにしておくこともできます。その場合、デフォルトで適切なデフォルトが設定されます (コマンド コンポーネントと入力コンポーネント用)。UICommand<h:commandButton>actioneventactionvalueChange

    <h:commandButton id="logOutButton" rendered="#{userIdBean.isLoggedIn}" value="Log Out" type="submit" action="#{loginBean.logoutUser}" >
        <f:ajax render="nodeL logOutButton"/>
    </h:commandButton>
    
  2. <f:ajax render>クライアント ID は、常にクライアント側にレンダリングされるコンポーネントを参照する必要があります。これは、JavaScript によって更新されるコンポーネントの HTML 表現そのものになります。renderedコンポーネントの HTML 表現がクライアント側に JSF レンダリングされない場合false、JavaScript は何も見つけて更新する必要がなく、事実上「何も」起こりません。たとえば@form、フォーム全体を示すように設定します。

    <h:commandButton id="logOutButton" rendered="#{userIdBean.isLoggedIn}" value="Log Out" type="submit" action="#{loginBean.logoutUser}" >
        <f:ajax render="@form" />
    </h:commandButton>
    

    または、常にレンダリングされる一般的なラッパー コンポーネント:

    <h:panelGroup id="group">    
        <h:outputText id="nodeL" value="Good Luck: #{userIdBean.userId}" style="font-weight:bold" rendered="#{userIdBean.isLoggedIn}" />
        <br></br>
        <h:commandButton value="Submit" action="#{regBean.storeUserId}" />
        <h:commandButton id="logOutButton" value="Log Out" action="#{loginBean.logoutUser}" rendered="#{userIdBean.isLoggedIn}">
            <f:ajax render="group" />
        </h:commandButton>
        <br></br>
        <h:outputText value="AJAX Response: #{userIdBean.userId}" rendered="#{userIdBean.isLoggedIn}" />
    </h:panelGroup>
    
于 2012-04-10T12:48:39.933 に答える
0

click以下のように、" "の代わりに " " イベントを使用keyupします。

<f:ajax event="click" render="nodeL logOutButton"/>
于 2012-04-09T03:50:17.800 に答える