在一个页面中,我有一个持续时间为 priod(整数月)的 InputText 框和一个用于选择初始日期的 p:calendar 输入。 我需要为从初始日期开始的所有月份生成标签(月-年)。 例如,如果持续时间为 3,初始日期为 10-dec-2014,则应生成以下三个标签: 2014年12月 2015年1月 2015年2月 我试着在没有支持 bean 的情况下做到这一点:
<c:forEach var="i" begin="1" end="${myBean.duration}">
<p:outputLabel value=" ${i+myVar} ${year+1900} " />
<h:panelGrid columnClasses="input, slider" columns="2">
<p:inputText id="inputTxt_${i}" style="width:70px;" />
<p:slider for="inputTxt_${i}"
style="padding-left: 100px; margin-left:5px">
<p:ajax event="slideEnd" />
</p:slider>
</h:panelGrid>
但是这样我无法正确生成标签。 任何人都知道如何通过使用带有或不带有提交按钮的 JSF 或 Backing bean 来做到这一点(例如使用 event="keyup"或 event="dateSelect"等事件)??
最佳答案
我认为您的 xhtml-Structure 不正确。
- 您缺少结尾
</c:forEach>
- 如果在代码片段末尾关闭,您将得到
{i}
slider
假设您想要一个 slider 和 {i}
日期输出
- 建立一个 BackingBean 来保存你的值
- 值是:“monthCount”保存整数,“dateList”保存(计算的)日期
listener-根据 slider 输入的整数计算日期的方法
public void listenerMonthCount(SlideEndEvent ae)
<h:form id="form"> <h:panelGrid columns="2"> <p:inputText id="monthCount" style="width:70px;" value="#{backingBean.monthCount}" /> <p:slider for="monthCount" style="padding-left: 100px; margin-left:5px" maxValue="12"> <p:ajax event="slideEnd" process="@form" listener="#{backingBean.listenerMonthCount}" update="form" /> </p:slider> </h:panelGrid> <ui:repeat var="month" value="#{backingBean.dateList}"> <h:outputText value="#{month}"> <f:convertDateTime pattern="MMM-yyyy" /> </h:outputText> <br /> </ui:repeat> </h:form>
更详细的解释:
p:ajax
-标签不仅需要event
-属性,还需要被告知要做什么。所以定义监听器listener="#{backingBean.listenerMonthCount}"
.为了让监听器知道新选择的 monthValue,必须将其传输到服务器 process="@form"
用于将这种形式的所有值从客户端传输到服务器。 update="form"
指示在处理完监听器后更新所有值。
<ui:repeat>
- block 包含输出的渲染。它遍历 List<Date>
并将每个项目分配给变量 month
.这是用 f:convertDataTime
打印和格式化的它将 Java-DateFormatPattern 作为 pattern
-属性。
在你的 Backing-Bean 中你本质上需要这个
private int monthCount = 0; // +getter/setter
private List<Date> dateList = new ArrayList<Date>(); // +getter/setter
public void listenerMonthCount(SlideEndEvent ae) {
dateList.clear(); // clear the list to remove entries from possible old runs
if (monthCount > 0) {
Date now = new Date();
dateList.add(now); // add first date
Calendar cal = Calendar.getInstance();
for (int i = 1; i < monthCount; i++) {
cal.setTime(dateList.get(dateList.size() - 1)); // get last date from list and set calendar
cal.add(Calendar.MONTH, 1);// add one month
dateList.add(cal.getTime()); // add calculated date
}
}
}
关于java - 在 JSF primefaces 中动态生成日期标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26732768/