0

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

        <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>

我的 bean 的片段:

   public Date getDeadline() {
    return deadline;
     }

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

    this.setDeadline(event.getDate());

}
4

2 回答 2

2

几件事:

  • 而不是使用#{user.getDeadline}你可以使用#{user.deadline}.
  • f:attribute name="minDate"p:calendar mindate="#{userr.minDate}"删除任何一个的副本。
  • 有一个默认验证器p:calendar,除非您要进行特殊验证,否则请删除<f:validator>.
  • bean 必须至少是视图范围的(不是请求范围的)才能工作。

此问题的一个非常常见的原因是更新目标设置错误。请使用萤火虫或某种元素检查在您的浏览器中检查为面板的父级设置的 id。

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

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

<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>

奖励:单击此处获取更方便的更新目标

于 2012-10-16T13:43:55.820 回答
1

首先,您的更新目标可能是错误的(嵌套表单:userForm:userReminderForm在 HTML/JSF 中无效),也许您想要这样做update=":userForm"(因为您不能像siebz0r指出的那样直接更新面板):

<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>

getDeadline是不必要的,当您引用支持 bean 属性时,只需使用它们的名称,如deadline.

请注意,您可以使用日历组件的验证器,因此您可以避免附加<f:validator validatorId = "dateValidator"/>标签。

在这种情况下,您的<f:attribute name="minDate" value="#{user.minDate}" />标签可能是不必要的。如果您想将您deadline的值设置为minDate(因为它们在同一个 bean 中),只需执行以下操作:

public void updateDeadlineDate(DateSelectEvent event) {
    mindDate = event.getDate()
    this.setDeadline(mindDate);
}

并删除<f:attribute name="minDate" value="#{user.minDate}" />.

最后我会empty在属性中使用关键字rendered而不是!= nullrendered="#{not empty user.deadline}"

于 2012-10-16T04:56:06.100 回答