2013-07-14 16 views
6

Chcę zrobić <p:calendar> tylko do odczytu, aby użytkownicy mogli wybrać datę z kalendarza tylko z powodu wydania this (nie jest to jednak rozwiązanie).Utwórz p: kalendarz tylko do odczytu

Aby było to tak, robię readonly="#{facesContext.renderResponse}" jak wspomniano przez this odpowiedź podobnego

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

To działa, ale po załadowaniu strony (wpisując adres URL w pasku adresu, a następnie naciskając enter klucz), facesContext.renderResponse zwraca false, a kalendarz nie jest już dostępny tylko do odczytu. Wartość ta wynosi true, po przesłaniu formularza przez naciśnięcie klawisza <p:commandButton>.

A więc, jak zrobić kalendarz tylko do odczytu, po załadowaniu strony?

P.S: Używam PrimeFaces 3.5 i Mojarra 2.1.9.

Odpowiedz

11

Zachowanie istotnie zmieniło się od czasu JSF 2.0. Numer FacesContext#getRenderResponse() tylko zwraca true, jeśli został wywołany. Poprzednio zdarzało się to podczas fazy przeglądania każdego żądania GET. Jednak od czasu wprowadzenia <f:viewParam>, JSF nie zrobi tego już, gdy obecny jest co najmniej jeden parametr widoku, po prostu będzie kontynuował wykonywanie każdej fazy bez pomijania żadnej fazy w celu poprawnego przetwarzania parametrów widoku.

Najwyraźniej masz na swojej stronie <f:viewParam>. To całkiem dobrze, ale jako test spróbuj go usunąć, a zobaczysz, że zwraca również true na zwykłe żądanie GET.

Masz zasadniczo 2 opcje, aby ominąć go:

  1. sprawdzić FacesContext#isPostback() również. Zawsze zwraca false na żądanie GET.

    readonly="#{not facesContext.postback or facesContext.renderResponse}" 
    
  2. Zamiast tego sprawdź numer FacesContext#getCurrentPhaseId(). Skończyłeś tylko na brzydszym kodzie (magiczne liczby).

    Jeśli używasz OmniFaces, możesz sprawić, że będzie mniej brzydki.

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

to bardzo ładne rozwiązanie :) –