2

Primefacesインプレースエディタを使用しています。(primefaces 3.2、3.3、3.4RC1、および3.4​​スナップショットを試しました)

フォームがajax以外のリクエストで送信され、フォームの他の必須フィールドに入力されなかった場合、ページがリロードされ、必要なメッセージが表示されます。しかし実際に起こることは次のとおりです。page-reloadとrequiredMessageに加えて、インプレースエディターはすでに表示されています。この問題を解決する方法は?

問題を再現するためのサンプルコード

<h:form prependId="false">
    <p:inplace editor="true" widgetVar="X">
        <p:inputTextarea value="#{smsAlertBean.alertText}" />
    </p:inplace>
</h:form>
<h:form prependId="false">
    <p:selectOneMenu required="true" requiredMessage="Please select">
                <!-- your values -->
    </p:selectOneMenu>
    <p:commandButton value="Submit" action="#{smsAlertBean.dummyAction}" ajax="false" />
</h:form>
4

1 に答える 1

3

これはのバグだと思い<p:inplace>ます。InplaceRenderer#encodeMarkup()メソッドから:

boolean validationFailed = context.isValidationFailed();
String displayStyle = validationFailed ? "none" : "inline";
String contentStyle = validationFailed ? "inline" : "none";

検証の失敗が「自分の」フォームに関係しているかどうかはチェックされないため、送信されたフォームに関係なく、検証の失敗時に常に表示されます。PrimeFacesソースコードの編集、カスタムレンダラーの作成、バグレポートの投稿以外に、これに対してできることはあまりありません。

でJavaScriptを使用してインプレースエディタを手動で閉じることで、これを回避できますwidgetVarcancel()エディターを閉じる機能があります。

<p:commandButton binding="#{foo}" value="Submit" action="#{smsAlertBean.dummyAction}" ajax="false" />
<h:outputScript rendered="#{param.containsKey(foo.clientId)}">X.cancel();</h:outputScript>

(したがって、このスクリプトは、コマンドボタンが実際に押されたときにレンダリングされます)

ただし、これは低速のマシン/ブラウザにのみ醜い影響を及ぼします。インプレースエディタが点滅します。PrimeFacesの担当者にバグとして報告することを検討してInplaceRendererください。まず、検証の失敗が自分のフォームに関係しているかどうかを確認する必要があります。

于 2012-08-29T11:50:30.957 に答える