我正在尝试执行以下操作:当用户在rich:calendar
组件中输入值时,h:inputText
应将其required
归因设置为true
。我按照这篇文章中的说明进行操作:Reference JSF control's attributes via JavaScript
很抱歉用于创建其他帖子,但我无法弄清楚如何将代码发布到评论区域并使其可读。该页面抛出此错误:
javax.el.ELException: /pages/overtime/overtime-n.xhtml @121,65 binding="#{oc.overtimeDate}": java.lang.IllegalArgumentException: argument type mismatch
问题是绑定在c:forEach
循环内,我正在尝试使用循环变量来绑定。 overtime.overtimeItems
定义为ArrayList<OvertimeComponent>
,每个OvertimeComponent对象具有各种属性(overtimeDate
,overtimeDateId
,id
,overtimeHours
等。) 。
<c:forEach items="#{overtime.overtimeItems}" var="oc">
<rich:calendar value="#{oc.overtimeDate}"
requiredMessage="Date 1 is required."
id="#{oc.overtimeDateId}"
binding="#{oc.overtimeDate}"
required="#{oc.id == 1 ? true : false}">
</rich:calendar>
<h:inputText value="#{oc.overtimeHours}"
id="#{oc.overtimeHoursId}"
requiredMessage="Hours is required."
required="#{not empty oc.overtimeDate.value}" >
</h:inputText>
.....
</c:forEach>
如果h:inputText
对象有值,如何使rich:calendar
成为必需项?有一种方法可以使用日历的binding
属性来执行此操作,但我不确定如何在c:forEach
内执行此操作。我不能在这个项目中使用AJAX。感谢。
答案 0 :(得分:2)
binding
属性应指向UIComponent
,而不是Date
之类的值对象。如果您没有使用c:forEach
,那么上一个问题的答案就会奏效。
<rich:calendar value="#{oc.overtimeDate}"
requiredMessage="Date 1 is required."
id="#{oc.overtimeDateId}"
binding="#{calendarComponent}"
required="#{oc.id == 1 ? true : false}">
</rich:calendar>
<h:inputText value="#{oc.overtimeHours}"
id="#{oc.overtimeHoursId}"
requiredMessage="Hours is required."
required="#{not empty calendarComponent.value}" >
</h:inputText>
上面的示例将组件绑定到“页面范围”,而不是绑定到特定的bean,因为您通常对bean内部的组件不感兴趣。您可以根据需要命名#{calendarComponent}
。您可以使用相同的名称在同一页面的任何位置访问它。
但是,在您的特定情况下,您使用的是c:forEach
而不是ui:repeat
,因此组件实际上会在组件树中重复(ui:repeat
仅在HTML呈现器中重复)。这意味着您无法使用建议的方法。然后,所有组件将共享相同的绑定,这是错误的。最好的方法是将UIComponent
(更精确的UIInput
)属性添加到oc
后面的对象并绑定到它,以便每个组件都有自己唯一的绑定。 E.g。
public class OvertimeComponent {
private UIInput calendarComponent;
// ...
与
<rich:calendar value="#{oc.overtimeDate}"
requiredMessage="Date 1 is required."
id="#{oc.overtimeDateId}"
binding="#{oc.calendarComponent}"
required="#{oc.id == 1}">
</rich:calendar>
<h:inputText value="#{oc.overtimeHours}"
id="#{oc.overtimeHoursId}"
requiredMessage="Hours is required."
required="#{not empty oc.calendarComponent.value}" >
</h:inputText>
(请注意,我简化了required
rich:calendar
属性的EL,因为它已经返回了boolean
答案 1 :(得分:1)
为什么日历上的值和组件绑定都指向同一个el表达式?您不能在类型为date的richfaces日历上进行组件绑定。
另外,您是否尝试过使用ui:repeat而不是c:foreach?
http://www.ilikespam.com/blog/c:foreach-vs-ui:repeat-in-facelets
c:已知foreach在与jsf和jsp生命周期不匹配相关的facelets上下文中给出问题。有关详细信息,请查看上面的帖子。