我对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。
答案 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);
}
}
希望这会有所帮助!!