【发布时间】:2011-11-09 15:27:19
【问题描述】:
自从我将 jquerys datePicker 添加到应用程序后,我在将日期应用到 managedBean 时遇到了问题。
我将日期选择器附加到两个日期字段,它工作正常(它会弹出并允许选择日期,输入字段会更改以正确反映日期选择)。
我的Bean.java
public class MyBean {
private Date startDate;
private Date endDate;
public MyBean()
{
...
}
public void filterList()
{
...
}
public Date getStartDate()
{
return startDate;
}
public void setStartDate(Date startDate)
{
this.startDate = startDate;
}
public Date getEndDate()
{
return endDate;
}
public void setEndDate(Date startDate)
{
this.endDate = endDate;
}
}
myPage.xhtml:
<h:form id="my_requests_pending">
<rich:panel id="filter_panel">
<h:panelGrid rendered="#{myBean.filter}">
<h:panelGrid>
<h:outputText id="startDateLbl" value="#{messages['MyBeanMessages.startDate']}" />
<h:panelGrid>
<h:inputText id="startDate" value="#{mysBean.startDate}">
<f:convertDateTime pattern="E, d MMM, yyyy" timeZone="#{localeBean.timeZone}" />
</h:inputText>
</h:panelGrid>
</h:panelGrid>
<h:panelGrid>
<h:outputText value="#{messages['MyBeanMessages.endDate']}" />
<h:panelGrid>
<h:inputText id="endDate" value="#{myBean.endDate}">
<f:convertDateTime pattern="E, d MMM, yyyy" timeZone="#{localeBean.timeZone}" />
</h:inputText>
</h:panelGrid>
</h:panelGrid>
<h:panelGrid columns="1">
<h:commandButton id="myReqSubmitBtn" value="#{messages['MyBeanMessages.submit']}" action="#{myBean.filterList}" />
</h:panelGrid>
</h:panelGrid>
</rich:panel>
</h:form>
我的日历.js
jQuery('startDate,endDate').datepicker.({
showOn : 'both',
changeMonth : true,
changeYear : true,
showOtherMonths : true,
selectOtherMonths : true,
showButtonPanel : true,
dateFormat : "D, d M, yy",
showAnim : "slideDown"
});
当我提交我的表单时出现问题。
setStartDate/setEndDate 方法被调用了两次(我可以在调试模式下看到)。
第一次将日期正确设置为新更改的日期,第二次调用将其重置为原始日期。
他们的 JSF 生命周期是否发生了我不知道的事情?
任何帮助表示赞赏。
更新
问题似乎出在“更新模型”JSF 阶段。 它输出以下调试代码:
09-Nov-2011 16:02:26 org.exadel.jsf.PhaseTracker beforePhase
INFO: BEFORE UPDATE_MODEL_VALUES 4
- 然后它在 setStartDate() 方法中命中断点并正确更新 startDate 属性。
- 当它离开 setStartDate() 方法时,它会多次调用 jsf 库等...并再次返回到我在 setStartDate() 中的断点!
- 然后我退出该方法并出现以下调试代码。
09-Nov-2011 17:06:21 org.exadel.jsf.PhaseTracker afterPhase INFO: AFTER UPDATE_MODEL_VALUES 4 09-Nov-2011 17:06:21 org.exadel.jsf.PhaseTracker beforePhase INFO: BEFORE INVOKE_APPLICATION 5
【问题讨论】:
-
那么,如果您删除
datePicker,它会按预期工作吗?这很奇怪。你能知道在哪个 JSF 阶段调用了这些方法,以及它是否真的在同一个 HTTP 请求中?为简洁起见,您省略的表格中实际上没有更多内容吗? -
是的,我删除了 datepicker 事件监听器并简单地手动更改了日期,它以这种方式提交很好。检查我的问题,了解导致问题的 JSF 阶段的更新。
-
这很奇怪。
datePicker脚本不会添加另一个具有同名的隐藏输入字段吗?使用 Firebug 或 Chrome 的“检查元素”来计算它。 -
这个问题让我很好奇,我迟早会自己用 jQuery UI DatePicker 测试它,但我想先知道你使用的是什么 JSF impl/version 和 RF 版本。顺便问一下,有什么特别的原因让你不只使用 RichFaces 自己的
<rich:calendar>? -
现在不在工作,所以无法详细回复。我将 JSF2 与 Richfaces 3.3 一起使用。我没有使用 Richfaces 日历,因为它没有提供一种简单的方法来在标题中分别显示月份和年份的下拉菜单(如果我将其更改为使用 Richfaces 选择方式,则需要通过很多业务签字圈月/年)。 jqueryui.com/demos/datepicker/#dropdown-month-year
标签: jquery jsf richfaces jquery-ui-datepicker