6

由于这个问题,我想<p:calendar>只读,以便用户只能从日历中选择一个日期(虽然这不是解决方案)。

为此,我正在按照这个答案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>

那么,如何在页面加载时使日历只读?

PS:我正在使用 PrimeFaces 3.5 和 Mojarra 2.1.9。

4

1 回答 1

15

自 JSF 2.0 以来,这种行为确实发生了变化。如果显式调用,则FacesContext#getRenderResponse()唯一返回。以前,这发生在每个 GET 请求的恢复视图阶段。但是,自从引入,JSF 将不再在存在至少一个视图参数时执行此操作,它将继续执行每个阶段而不跳过任何阶段,以便正确处理视图参数。trueFacesContext#renderResponse()<f:viewParam>

您的页面中显然有一个<f:viewParam>。这完全没问题,但作为一个测试,尝试删除它,你会看到它也会true在一个普通的 GET 请求中返回。

你基本上有两种选择来解决它:

  1. 也检查一下FacesContext#isPostback()。它总是返回falseGET 请求。

    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}"
    
于 2013-07-14T12:52:39.947 回答