Primefaces日历未设置日期

时间:2017-07-19 09:03:02

标签: jsf primefaces calendar

我对Primefaces的工作逻辑还有另一种误解。

现在,当我按下提交按钮时,<p:calendar>组件无法设置所选日期 我看到它成功进入actionListener方法,但日期值为null。

首先,我尝试使用标准PF example创建我的日历。它看起来太简单了,我认为,当用户选择日期或提交表单时,组件应该调用值设置器。但它既没有在第一种情况下也没有在第二种情况下这样做。 好吧,我打开谷歌并发现了一些帖子:

Primefaces Calendar Setting Date Value in Backing Bean
p:calendar value not set in backing bean

我确保我的日历位于<h:form></h:form>个标签之间。我还尝试添加process="@this"process=":beginDateForm :endDateForm @this",其中beginDateForm和endDateForm是包含<p:calendar>个组件的表单。
我还找到了post并尝试创建SelectEvent侦听器方法:

private void changeDate(SelectEvent event) {
    beginDate = (Date) event.getObject();
}

但未成功。

我还尝试使用valueChangeListener更改日期:

<h:form id="beginDateForm">
    <p:calendar id="passBeginDate" valueChangeListener="#{territoryFormBean.changeDate}" mode="popup" readonly="true" pattern="dd.MM.yyyy" showOn="button" value="#{territoryFormBean.beginDate}" />
</h:form>

当然我将事件更改为ValueChangeEvent。

之后,我将<p:calendar><p:commandButton>个组件移到了同一个<h:form>,并尝试了两个不同的过程值process="passTerrForm:passBeginDate passTerrForm:passEndDate @this"process="@form @this"以及process="@form" 在最后一种情况下,按钮甚至不会触发侦听器方法。

我目前的组成部分是:

<p:commandButton value="Search" id="searchPassButton" actionListener="#{territoryFormBean.search}" update=":passTerrForm:territoryTable" process="passTerrForm:passBeginDate passTerrForm:passEndDate @this" partialSubmit="true" />

<p:column>
    <p:calendar id="passBeginDate" mode="popup" readonly="true" pattern="dd.MM.yyyy" showOn="button" value="#{territoryFormBean.beginDate}" />
</p:column>
<p:column>
    <p:calendar id="passEndDate" mode="popup" readonly="true" pattern="dd.MM.yyyy" showOn="button" value="#{territoryFormBean.endDate}" />
</p:column>

伙计们,你能否提出别的建议。或者你可能会看到我的代码中出了什么问题。 我无法理解为什么组件不会调用setter。

3 个答案:

答案 0 :(得分:4)

嗯,伙计们,我发现了我的错误。愚蠢的错误。另一个重新阅读PF文档显示,使用readonly参数对我的目标不正确。我想阻止手动日期直接输入<p:calendar>文本字段。但根据文件: readonly -

  

表示此输入元素将阻止更改的标志   用户

但我需要readonlyInput参数

  

只读取弹出日历的输入文本。

因此第二个参数会阻止输入,而第一个参数会完全阻止输入 谢谢你的帮助。

答案 1 :(得分:0)

尝试用我所拥有的代码进行类比,我认为将按钮设置为与日历相同的形式,并省略'process'和'partialSubmit'应该有效:

    <h:form id="beginDateForm">
     <p:calendar id="passBeginDate" valueChangeListener="#{territoryFormBean.changeDate}" mode="popup" readonly="true" pattern="dd.MM.yyyy" showOn="button" value="#{territoryFormBean.beginDate}" />
     <p:commandButton value="Search" id="searchPassButton" actionListener="#{territoryFormBean.search}" update=":passTerrForm:territoryTable" />
    </h:form>

我希望它有所帮助!

答案 2 :(得分:0)

JSF代码:

<p:calendar id="from" value="#{pageBean.event.startDate}"   pattern="MM/dd/yyyy hh:mm:ss a" timeZone="GMT-4"/>

<p:commandButton id="addButton" value="Save" actionListener="#{pageBean.addEvent}" update=":@form"/>

您可以在Bean中编写 addEvent 方法,您需要将这些日历事件添加到 eventModel 并保存。这有助于您设置日期,您可以根据需要进行检索。

Java代码:

private ScheduleModel eventModel;
private ScheduleEvent event = new DefaultScheduleEvent();
public String addEvent(ActionEvent actionEvent) {    

   if(event.getId() == null){
        eventModel.addEvent(event);
   }
}

希望这会有所帮助!!