2

次のような 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 関数の新しいターゲット、または問題にアプローチする別の方法のいずれかです。前もって感謝します!

4

1 に答える 1

0

oncompleteJavaScriptを削除して使用してみてくださいreRender="mainPanel"

<a4j:commandButton value="Save Changes" 
                   action="#{bean.save}" 
                   rendered="#{bean.selectedItemId gt 0}"
                   reRender="mainPanel" />

あなたのバージョンでは、reRender属性のない「変更を保存」ボタンを押すと、すべてのページが再レンダリングされ、メッセージが更新されると思います。

于 2011-04-01T08:46:14.533 に答える