2

このコードは、私が思っていたこととまったく同じではありません。Ajax でプロパティを設定してから、1 つのコンポーネントを再レンダリングしようとしています。私の .xhtml は次のようになります

    <h:form>
        <h:commandButton value="Render!" >
            <f:ajax render=":result" listener="#{eFindUser.findUser}" />
        </h:commandButton>

    </h:form>

    <h:panelGroup id="result" layout="block" rendered="#{eFindUser.responseRendered}" >
        This is some text that is supposed to be rendered later
    </h:panelGroup>

バッキングビーンはこんな感じ

@Named(value = "eFindUser")
@ViewScoped
public class EFindUserManagedBean implements Serializable{
    private boolean responseRendered = false;
    /**
     * Creates a new instance of EFindUserManagedBean
     */

    public EFindUserManagedBean() {
    }

    public void findUser(AjaxBehaviorEvent abe) {
        responseRendered = !responseRendered;
        System.out.println("finding..... ("+ responseRendered+")" + this);
    }
    public boolean isResponseRendered() {
        return responseRendered;
    }

    public void setResponseRendered(boolean responseRendered) {
        this.responseRendered = responseRendered;
    }       
}

ボタンを再度クリックしても、プロパティは変更されません。サーバーログに次のメッセージがあります。

INFO: finding..... (true)backingbeans.EFindUserManagedBean@5736b751
INFO: finding..... (true)backingbeans.EFindUserManagedBean@23959d6f

マネージド Bean は、ビュー スコープである必要がある場合でも、リクエストがあるたびに作成されるため、明らかに何らかの問題があります。

panelgroup(id:"result") が可視性を変更できるようにするには、何を変更すればよいですか? リッチフェイスやその他のテクノロジーは許可されていません。

ご回答ありがとうございました

4

2 に答える 2

6

常時レンダリングされない JSF コンポーネントを動的にレンダリングすることはできません。オブジェクトは DOM クライアント側に存在する必要があります。render="false" を使用すると、出力はサーバー側で生成されません。

次のようにコードを変更します。

<h:form>
    <h:commandButton value="Render!" >
        <f:ajax render=":result" listener="#{eFindUser.findUser}" />
    </h:commandButton>

</h:form>

<h:panelGroup id="result">
    <h:panelGroup layout="block" rendered="#{eFindUser.responseRendered}" >
        This is some text that is supposed to be rendered later
    </h:panelGroup>
</h:panelGroup>

これにより、DOM には常に id="result" を持つものが含まれます。

于 2013-05-05T19:28:24.053 に答える