3

クリックすると、ページから他の特定のフォームフィールドを追加/削除するチェックボックスが必要なJSFページがあります。チェックボックス用に現在持っている(簡略化された)コードは次のとおりです。

<h:selectBooleanCheckbox title="showComponentToReRender" value="#{backingBean.showComponentToReRender}">
    <a4j:support event="onsubmit" reRender="componentToReRender" />
</h:selectBooleanCheckbox>

非表示にしたいコンポーネントのコードは次のとおりです。

<h:selectOneMenu id="componentToReRender" value="#{backingBean.value}" rendered="#{valuesList.rowCount>1 &amp;&amp; backingBean.showComponentToReRender}">
   <s:selectItems value="#{valuesList}" var="value"/>
</h:selectOneMenu>

現在、チェックボックスをクリックしても何も起こりません。その「selectOneMenu」はなくなりません。私は何を間違っていますか?

4

2 に答える 2

10

componentToReRender次のいずれかでラップする必要があります。

<h:panelGroup id="componentToReRenderWrapper">

また

<a4j:outputPanel id="componentToReRenderWrapper">

したがって、効果的に次のものが得られます。

<h:panelGroup id="componentToReRenderWrapper">
    <h:selectOneMenu id="componentToReRender" value="#{backingBean.value}" rendered="#{valuesList.rowCount>1 &amp;&amp; backingBean.showComponentToReRender}">
       <s:selectItems value="#{valuesList}" var="value"/>
    </h:selectOneMenu>
</h:panelGroup>

reRender="componentToReRenderWrapper"を使用する場合はを変更し、を使用する場合panelGroupはその属性を削除しますoutputPanel

RichFaces docsで正確な説明を見つけました:

reRender の使用に関する最も一般的な問題は、「rendered」属性を持つコンポーネントを指すことです。JSF は、「レンダリング」条件が false を返す場合に、コンポーネントの結果を配置する必要があるブラウザー DOM 内の場所をマークしないことに注意してください。したがって、Ajax リクエスト中にコンポーネントがレンダリングされた後、RichFaces はレンダリングされたコードをクライアントに配信しますが、更新の場所が不明であるため、ページを更新しません。「レンダリング」属性を持たない親コンポーネントの 1 つを指す必要があります。別の方法として、コンポーネントを layout="none" でラップすることもできます。

于 2010-01-08T22:25:59.247 に答える
2

a4j:outputPanel で ajaxRendered="true" を設定することを忘れないでください

于 2010-08-19T13:56:23.060 に答える