6

この<p:calendar>問題のため、ユーザーがカレンダーからのみ日付を選択できるように、読み取り専用にしたいと思います(ただし、これは解決策ではありません)。

これがそうであるために、私はこの答えreadonly="#{facesContext.renderResponse}"で述べたようにやっています、

<p:calendar id="calendarId" 
        value="#{bean.property}" 
        converter="#{jodaTimeConverter}" 
        pattern="dd-MMM-yyyy hh:mm:ss a" 
        showOn="button" 
        readonly="#{facesContext.renderResponse}" 
        effect="slideDown"
        required="true" 
        showButtonPanel="true" 
        navigator="true"/>

これは機能しますが、ページが読み込まれると (アドレス バーに URL を入力して Enter キーを押すと) がfacesContext.renderResponse返さfalseれ、カレンダーは読み取り専用ではなくなります。trueを押してフォームを送信すると、と評価され<p:commandButton>ます。

では、ページがロードされたときにカレンダーを読み取り専用にする方法は?

PS : PrimeFaces 3.5 と Mojarra 2.1.9 を使用しています。

4

1 に答える 1

15

JSF 2.0以降、動作は実際に変更されました。が明示的に呼び出された場合にFacesContext#getRenderResponse()のみ戻ります。以前は、これはすべての GET 要求の復元ビュー フェーズで発生していました。ただし、JSF の導入により、少なくとも 1 つのビュー パラメータが存在する場合、JSF はそれを行わなくなり、ビュー パラメータを適切に処理するために、フェーズをスキップすることなく、すべてのフェーズを実行し続けます。trueFacesContext#renderResponse()<f:viewParam>

どうやら<f:viewParam>あなたのページには があります。trueそれはまったく問題ありませんが、テストとして、それを削除してみてください。プレーンな GET 要求でも返されることがわかります。

それを回避するには、基本的に 2 つのオプションがあります。

  1. もチェックFacesContext#isPostback()falseGET リクエストでは常に返されます。

    readonly="#{not facesContext.postback or facesContext.renderResponse}"
    
  2. FacesContext#getCurrentPhaseId()代わりにチェックしてください。醜いコード (マジック ナンバー) で終わるだけです。

    readonly="#{facesContext.currentPhaseId.ordinal eq 6}"
    

    OmniFacesを使用している場合は、見苦しくないようにすることができます。

    <o:importConstants type="javax.faces.event.PhaseId" />
    ...
    readonly="#{facesContext.currentPhaseId eq PhaseId.RENDER_RESPONSE}"
    
于 2013-07-14T12:52:39.947 に答える