6

ユーザーがを押した後に表示/非表示にしたいコンポーネントがありますcommandButton

こんな感じです:

<h:commandButton id="showButton" value="#{bean.wasPressed ? 'Hide' : 'Show'}">
    <f:ajax listener="#{bean.toggle()}" render="explanation showButton" />
</h:commandButton>

<h:panelGroup id="explanation" rendered="#{bean.wasPressed}">
    <h:outputText value="something" />
</h:panelGroup>

プロパティをtrueまたはfalseに適切にbean.toggle()設定するだけです。wasPressed私はを使用して<h:form prependId="false">います。

問題はrender、ボタンの属性の値です。explanation:との両方を明示的に参加させshowButtonます。

が常に存在する限りshowButton(ラベルを変更するだけです) 、プロパティがtrueexplanationの場合にのみ存在します。wasPressedそうでなければそれは言う:

malformedXML:更新中:説明が見つかりません

どうすればこの問題を解決できますか?

ソースコードで要素を非表示に戻さないようにしたいので、jQueryのtoggle(-)や、style="display: none"またはこれらを使用して要素を非表示にする方法を使用しないようにします。

JSF 2.1でも実現可能ですか?

4

1 に答える 1

10

レンダリングされていない要素を更新することはできません。rendered=falseは「JSFの方法です」DOMツリーから要素を削除します。

css display:noneやvisibility:hidden <-とは異なり、この2つは要素をDOMツリーに保持しますが、非表示にします。一方、JSF render = falseは、要素をDOMツリーにレンダリング(保持)しません(表示されません)。ページの「ソースの表示」で)

したがって、あなたの場合、panelGroupを別の `panelGroup'でラップし、ラッパーのIDを更新する必要があります

<h:commandButton id="showButton" value="#{bean.wasPressed ? 'Hide' : 'Show'}">
    <f:ajax listener="#{bean.toggle()}" render="explanationWrapper showButton" />
</h:commandButton>


<h:panelGroup id="explanationWrapper">
    <h:panelGroup id="explanation" rendered="#{bean.wasPressed}">
        <h:outputText value="something" />
    </h:panelGroup>
</h:panelGroup>

同様の質問も見てください

ap:ajaxリスナーからh:outputLabelを更新できますか?

于 2012-12-08T15:45:54.067 に答える