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( .... 

установите точку останова и попробуйте в "часах" затмения...

Другие вопросы по тегам