我想将 <p:calendar>
设置为只读,以便由于this问题而使用户只能从日历中选择一个日期(尽管这不是解决方案)。
为此,我正在按照this回答中提到的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>
。那么,如何在加载页面时使日历变为只读状态?
附言:我使用的是PrimeFaces 3.5和Mojarra 2.1.9。
最佳答案
自JSF 2.0以来,该行为的确发生了变化。如果明确调用了 FacesContext#getRenderResponse()
,则 true
仅返回FacesContext#renderResponse()
。以前,这是在每个GET请求的还原 View 阶段发生的。但是,由于引入了<f:viewParam>
,当存在至少一个 View 参数时,JSF将不再这样做,它将仅继续执行每个单个阶段,而无需跳过任何阶段以正确处理 View 参数。
您的页面中显然有一个<f:viewParam>
。完全没问题,但是作为测试,尝试将其删除,您会发现它也对普通的GET请求返回true
。
基本上,您有2个解决方案:
FacesContext#isPostback()
。它总是在GET请求上返回false
。readonly="#{not facesContext.postback or facesContext.renderResponse}"
FacesContext#getCurrentPhaseId()
。您只会得到难看的代码(魔术数字)。readonly="#{facesContext.currentPhaseId.ordinal eq 6}"
如果您使用的是OmniFaces,则可以使其不太难看。
<o:importConstants type="javax.faces.event.PhaseId" />
...
readonly="#{facesContext.currentPhaseId eq PhaseId.RENDER_RESPONSE}"
关于jsf - 制作一个p :calendar readonly,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17639415/