2013-07-14 11 views
6

मैं <p:calendar> को केवल पढ़ने के लिए बनाना चाहता हूं ताकि उपयोगकर्ता this समस्या के कारण कैलेंडर से केवल दिनांक चुन सकें (हालांकि यह समाधान नहीं है)।एक पी बनाएं: कैलेंडर रीडोनली

यह इतना होने के लिए, मैं readonly="#{facesContext.renderResponse}" कर रहा हूँ के रूप में this उत्तर की तरह से उल्लेख किया है,

<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.renderResponsefalse देता है और कैलेंडर अब पढ़ा नहीं जाता है। यह true का मूल्यांकन करता है, जब मैं <p:commandButton> दबाकर फ़ॉर्म सबमिट करता हूं।

तो, पृष्ठ लोड होने पर कैलेंडर को केवल पढ़ने के लिए कैसे करें?

पीएस: मैं प्राइमफेस 3.5 और मोजाररा 2.1.9 का उपयोग कर रहा हूं।

उत्तर

11

जेएसएफ 2.0 के बाद व्यवहार वास्तव में बदल गया है। FacesContext#getRenderResponse() केवल true देता है यदि FacesContext#renderResponse()स्पष्ट रूप से कहा जाता है। पहले यह हर जीईटी अनुरोध के बहाली दृश्य चरण के दौरान हुआ था। हालांकि, <f:viewParam> की शुरूआत के बाद से, जेएसएफ अब ऐसा नहीं करेगा जब कम से कम एक दृश्य पैरामीटर मौजूद होगा, यह दृश्य पैरामीटर को सही ढंग से संसाधित करने के लिए किसी भी चरण को छोड़ दिए बिना प्रत्येक चरण को निष्पादित करना जारी रखेगा।

आपके पृष्ठ में आपके पास <f:viewParam> है। यह पूरी तरह से ठीक है, लेकिन एक परीक्षण के रूप में, इसे हटाने का प्रयास करें और आप देखेंगे कि यह सादा जीईटी अनुरोध पर true लौटाता है।

  1. रूप में अच्छी तरह FacesContext#isPostback() की जाँच करें:

    आप मूल रूप से 2 विकल्प उसके चारों ओर पाने के लिए किया है। यह जीईटी अनुरोधों पर हमेशा false देता है।

    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}" 
    
+0

यह बहुत अच्छा समाधान है :) –

संबंधित मुद्दे