次のような h:selectOneMenu をセットアップしました。
<f:view>
<h:form id="tehForm">
<h2>Header</h2><br/>
<a4j:outputPanel id="msgPanel" ajaxRendered="true">
<h:messages styleClass="message"/>
</a4j:outputPanel>
<a4j:outputPanel id="mainPanel" ajaxRendered="true"><br/>
Select an item:<br/>
<h:selectOneMenu id="itemMenu" value="#{bean.itemId}">
<f:selectItem itemValue="-1" itemLabel="Please Select..."/>
<s:selectItems value="#{bean.item}" itemValue="#{item.id}" var="item" label="#{item.name}"/>
<a4j:support event="onchange" action="#{bean.selectItem}"/>
</h:selectOneMenu>
<rich:spacer width="10px"/>
<a4j:commandLink value="Create New" action="#{bean.createNew}"
rendered="#{bean.selectedItemId != 0}"/>
<h:outputText rendered="#{bean.selectedItemId gt -1}" value="Item Name: "/><br/>
<h:inputText rendered="#{bean.selectedItemId gt -1}" value="#{bean.selectedItem.name}" maxlength="50" size="75"/><br/><br/>
<a4j:commandButton value="Save New" action="#{bean.save}" rendered="#{bean.selectedItemId == 0}"/>
<a4j:commandButton value="Save Changes" action="#{bean.save}" rendered="#{bean.selectedItemId gt 0}" oncomplete="jsRerender();" />
<a4j:jsFunction name="jsRerender" rerender="mainPanel"/>
</a4j:outputPanel>
</h:form>
</f:view>
新しいアイテムを作成するとき、新しいアイテムはドロップダウンに表示されますが、アイテムの「名前」属性を変更して保存すると、ラベルは次のリクエストの後まで新しい名前に変更されません。 Bean のデータが変更されました。
そのため、変更の保存が完了したら、2 回目の呼び出しを強制的に再レンダリングすることで回避しました。問題は、これによりメッセージ パネルも再レンダリングされるため、表示された可能性のあるメッセージを削除することです。で使用limitToList="true"
すると、a4j:jsFunction
呼び出さないのと同じ効果があります。
提案が必要です。rerender 関数の新しいターゲット、または問題にアプローチする別の方法のいずれかです。前もって感謝します!