Primefaces p: календарь со значением p:ajax не обновляется (задержка в один шаг)

Я хочу вызвать бин после выбора даты в p:calendar, В моей настройке у меня есть @Named @ViewScoped Боб, класс ObWithDate это @Entity с полем даты validFrom.

<h:form id="fUser">
  <p:dataTable id="dt" var="cum" value="#{myBean.listObWithDates}">
    <p:column>
      <p:calendar id="cValidFrom" value="#{cum.validFrom}">  
        <p:ajax event="dateSelect" listener="#{myBean.update(cum)}"
                update=":fUser:dt"/>  
      </p:calendar>  
    </p:column>
  </p:dataTable>
</h:form>

Хорошо, что метод бобов update(ObWithDate myO) вызывается с правильным объектом каждый раз, когда я выбираю дату. Плохо то, что myO.validFrom не имеет правильного значения. Это всегда на шаг позади:

  • Поле инициализировано с 2012-01-01
  • Изменение графического интерфейса на 2012-01-05, отладка метода bean на 2012-01-01
  • Изменение графического интерфейса на 2012-01-15, отладка метода bean на 2012-01-05

Эта проблема сводит меня с ума, я обнаружил несколько проблем с неправильно обновленными значениями, а также некоторые о p:calendar, Большинство из них предлагают использовать атрибут selectListener="#{calendarBean.handleDateSelect}" с handleDateSelect(DateSelectEvent event) метод. Но я хочу вызвать мой метод, так как я хочу передать текущий экземпляр переменной.

  • Firebug проверяет, что правильные обновленные значения передаются в запросе POST
  • Я использую Primefaces 3.2 и JBoss-7.1.1-Final
  • Даже без p:dataTable и только используя p:calendar проблема все та же.
  • Неправильное значение вывода отладки можно наблюдать для метода-объекта update(ObWithDate myO) а также для соответствующей записи в myBean.listObWithDates,
  • <p:ajax immediate="true" .../> не решает эту проблему.

Обновление MattHandy мне очень помогло, возникший вопрос Как получить соответствующий элемент списка в вызове ajax внутри метода бинов ? сформулировано в следующем JSF p:calendar в p:dataTable: Как получить строку события date: select p: ajax.

2 ответа

Решение

Это, скорее всего, проблема жизненного цикла. Сеттер для вашего поля вызывается перед выполнением слушателя. Вы не должны использовать слушателя, чтобы установить свое значение.

Выражение el на вашем слушателе оценивается на этапе ответа рендеринга предыдущего запроса, таким образом, оно содержит cum значение "на шаг позади".

Вы должны обновить свой пользовательский объект из установщика значения даты календаря.

Я столкнулся с этим вопросом сегодня утром. Обнаружено, что простые лица удалили DateSelectEvent из Primefaces 3.5 . Следовательно, пришлось удалить вызов события ajax из моего объекта календаря. Вместо этого извлекаем значение, используя get..(). Пожалуйста, найдите обсуждение того же в этой ссылке ниже. http://forum.primefaces.org/viewtopic.php?f=3&t=27590

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