Jsf 如何基于日历更新prime faces上的选定日期,以便呈现/隐藏面板内容

Jsf 如何基于日历更新prime faces上的选定日期,以便呈现/隐藏面板内容,jsf,calendar,primefaces,Jsf,Calendar,Primefaces,我有一个组件,用户可以在其中选择设置任何日期,甚至设置为null,但是当日期不为null时,它应该呈现一个面板以允许其他选项。但是,日期不会更新,并且始终为空,因此它不会呈现面板。这方面需要帮助。下面是我的代码: <p:calendar id="dt" value="#{user.deadline}" pattern="MM/dd/yyyy"

我有一个组件,用户可以在其中选择设置任何日期,甚至设置为null,但是当日期不为null时,它应该呈现一个面板以允许其他选项。但是,日期不会更新,并且始终为空,因此它不会呈现面板。这方面需要帮助。下面是我的代码:

        <p:calendar id="dt"
                    value="#{user.deadline}"
                    pattern="MM/dd/yyyy"                        
                    showOn="button"
                    mindate="#{userr.minDate}">
            <f:validator validatorId = "dateValidator"/>
            <f:attribute name="minDate" value="#{user.minDate}" />

            <p:ajax event="dateSelect" listener="#{user.updateDeadlineDate}" update=":userForm:userReminderForm"/>
        </p:calendar>

        <p:panel id= "myPanel" rendered="#{user.getDeadline != null}">
         .. some component that needs user.deadline

        </p:panel>

首先,您的更新目标可能是错误的(嵌套表单
:userForm:usermemenderform
在HTML/JSF中无效),您可能想执行
update=“:userForm”
(因为您无法直接更新面板):

然后卸下


最后,我将在
呈现的
属性中使用
关键字,而不是
!=null
rendered=“#{not empty user.deadline}”
首先,您的更新目标可能是错误的(嵌套表单
:userForm:usermemenderform
在HTML/JSF中无效),可能您想执行
更新=“:userForm”
(因为您无法直接更新面板):

然后卸下

最后,我将在
呈现的
属性中使用
关键字,而不是
!=null
rendered=“#{not empty user.deadline}”
有几件事:

  • 您可以使用
    {user.getDeadline}
    而不是使用
    {user.getDeadline}
  • f:attribute name=“minDate”
    p:calendar minDate=“#{userr.minDate}”
    的副本,请删除其中一个
  • 对于
    p:calendar
    ,有一个默认的验证器,除非您正在执行特殊验证,否则请删除
  • bean必须至少具有视图范围(而不是请求范围)才能工作
此问题的一个常见原因是更新目标设置错误。请使用firebug或某种元素检查在浏览器中检查为面板的父级设置了什么id

使用
rendered
属性时要记住的一点是,元素对客户端不可见。必须指示客户端更新未渲染元素的父元素。(看起来你已经在这么做了。)

如果日历和面板的格式相同,则可以使用
@form
作为目标。这样,元素的形式将被更新。(这可能是您想要的。)


.. 某些组件需要user.deadline
奖励:。

几件事:

  • 您可以使用
    {user.getDeadline}
    而不是使用
    {user.getDeadline}
  • f:attribute name=“minDate”
    p:calendar minDate=“#{userr.minDate}”
    的副本,请删除其中一个
  • 对于
    p:calendar
    ,有一个默认的验证器,除非您正在执行特殊验证,否则请删除
  • bean必须至少具有视图范围(而不是请求范围)才能工作
此问题的一个常见原因是更新目标设置错误。请使用firebug或某种元素检查在浏览器中检查为面板的父级设置了什么id

使用
rendered
属性时要记住的一点是,元素对客户端不可见。必须指示客户端更新未渲染元素的父元素。(看起来你已经在这么做了。)

如果日历和面板的格式相同,则可以使用
@form
作为目标。这样,元素的形式将被更新。(这可能是您想要的。)


.. 某些组件需要user.deadline

奖励:。

OP的更新目标是正确的。您无法更新未呈现的元素,因为客户端不知道该元素的存在。您是对的@siebz0r,我忽略了这种情况。我的答案是正确的。非常感谢你指出这些,它现在正在工作:)OP的更新目标是正确的。您无法更新未呈现的元素,因为客户端不知道该元素的存在。您是对的@siebz0r,我忽略了这种情况。我的答案是正确的。非常感谢您指出这些问题,它现在起作用了:)
   public Date getDeadline() {
    return deadline;
     }

public void setDeadline(Date deadline) {
    this.deadline=deadline;
      }
 public void updateDeadlineDate(DateSelectEvent event) {

    this.setDeadline(event.getDate());

}
<p:ajax event="dateSelect" listener="#{user.updateDeadlineDate}" update=":userForm"/>

<p:panel id= "myPanel" rendered="#{user.deadline != null}">
     .. some component that needs user.deadline

</p:panel>
public void updateDeadlineDate(DateSelectEvent event) {
    mindDate = event.getDate()
    this.setDeadline(mindDate);
}
<p:calendar id="dt"
        value="#{user.deadline}"
        pattern="MM/dd/yyyy"                        
        showOn="button"
        mindate="#{userr.minDate}">
    <p:ajax event="dateSelect" listener="#{user.updateDeadlineDate}" update="@form"/>
</p:calendar>

<p:panel id= "myPanel" rendered="#{user.getDeadline != null}">
    .. some component that needs user.deadline
</p:panel>