2013-07-14 10 views
6

Ich möchte <p:calendar> nur lesen, so dass Benutzer nur ein Datum aus dem Kalender wegen this Problem auswählen können (dies ist jedoch keine Lösung).Machen Sie ein p: Kalender readonly

Für diese so sein, ich tue readonly="#{facesContext.renderResponse}" als wie von this Antwort erwähnt,

<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"/> 

Dies funktioniert aber, wenn die Seite geladen wird (die URL in der Adressleiste eingeben und dann das Drücken der Eingabetaste Taste), facesContext.renderResponse gibt false zurück und der Kalender wird nicht mehr gelesen. Es wird true ausgewertet, wenn ich das Formular durch Drücken von <p:commandButton> abschicke.

Also, wie man den Kalender readonly, wenn die Seite geladen ist?

P.S: Ich benutze PrimeFaces 3.5 und Mojarra 2.1.9.

Antwort

11

Das Verhalten hat sich seit JSF 2.0 tatsächlich geändert. Die FacesContext#getRenderResponse() gibt nur true zurück, wenn FacesContext#renderResponse()explizit aufgerufen wurde. Zuvor war dies während der Wiederherstellungsphase jeder GET-Anfrage der Fall. Seit der Einführung von <f:viewParam> wird JSF dies jedoch nicht mehr tun, wenn mindestens ein Ansichtsparameter vorhanden ist, es wird einfach jede einzelne Phase ohne Überspringen einer Phase weiter ausführen, um die Ansichtsparameter richtig zu verarbeiten.

Sie haben anscheinend eine <f:viewParam> in Ihrer Seite. Das ist völlig in Ordnung, aber als Test, versuchen Sie, es zu entfernen und Sie werden sehen, dass es true auf eine einfache GET-Anfrage zurückgibt.

Sie haben grundsätzlich zwei Möglichkeiten um es zu bekommen:

  1. die FacesContext#isPostback() auch prüfen. Es liefert immer false auf GET-Anfragen.

    readonly="#{not facesContext.postback or facesContext.renderResponse}" 
    
  2. Überprüfen Sie die FacesContext#getCurrentPhaseId() statt. Sie haben nur einen hässlicheren Code (magische Zahlen).

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

    Wenn Sie OmniFaces verwenden, könnte man es weniger hässlich machen.

    <o:importConstants type="javax.faces.event.PhaseId" /> 
    ... 
    readonly="#{facesContext.currentPhaseId eq PhaseId.RENDER_RESPONSE}" 
    
+0

das ist sehr schöne Lösung :) –

Verwandte Themen