gpt4 book ai didi

jsf - 制作一个p :calendar readonly

转载 作者:行者123 更新时间:2023-12-04 13:40:28 28 4
gpt4 key购买 nike

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

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com