JSF p: календарь в p:dataTable: как получить строку события p:ajax dateSelect
В моей настройке у меня есть @Named
Боб, класс ObWithDate
это @Entity
с полем даты validFrom. Объекты этого класса находятся в List<ObWithDate>
бобов. Я хочу обновить ObWithDate
немедленно, если пользователь меняет дату. p:dataTable
Таким образом, показывает несколько p:calendar
компоненты:
<h:form id="fUser">
<p:dataTable id="dt" var="i" value="#{myBean.list}">
<p:column>
<p:calendar id="cValidFrom" value="#{i.validFrom}">
<p:ajax event="dateSelect" listener="#{myBean.up}" update=":fUser:dt"/>
</p:calendar>
</p:column>
</p:dataTable>
</h:form>
Код боба:
public void up(DateSelectEvent event)
{
logger.info("DateSelectEvent "+event.getDate());
// How to get the corresponding ObWithDate?
}
Это следующий вопрос о Primefaces p:calendar со значением p:ajax, которое не обновляется (с задержкой в один шаг), но теперь нацелено на конкретную проблему: как получить соответствующий элемент списка в вызове ajax внутри метода beans?
2 ответа
Вы могли бы решить #{i}
(ужасное имя переменной, кстати) программно.
FacesContext context = FacesContext.getCurrentInstance();
ObWithDate obWithDate = (ObWithDate) context.getApplication().evaluateExpressionGet(context, "#{i}", ObWithDate.class);
// ...
Альтернативой является использование DataModel
как значение <p:dataTable>
так что вы можете использовать DataModel#getRowData()
,
private transient DataModel<ObWithDate> model;
private DataModel<ObWithDate> getModel() {
if (model == null) {
model = new ListDataModel<ObWithDate>(list);
}
return model;
}
так что вы можете получить его в методе слушателя следующим образом
ObWithDate obWithDate = model.getRowData();
// ...
Смотрите также:
@ Даниэль, пожалуйста, добавьте это как ответ, по крайней мере, это обходной путь
добавление:)
Это может быть направление (миг не так:))
UIComponent ui = (UIComponent) event.getSource();
ui.getParent().findComponent( ....
установите точку останова и попробуйте в "часах" затмения...