我想将 <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/

    10-11 09:23