2015-05-01 3 views
1

У меня возникли проблемы с реализацией события прослушивания ajax, которое обнаруживает, когда дата изменяется в форме. У меня есть datatable, и внутри одного из столбцов у меня есть <ace:dateTimeEntry>, который содержит поле даты начала, которое хранится в bean-компоненте. (Примечание: альянс - это имя переменной, используемой для данных).Значение бина не обновляется до того, как прослушиватель событий ajax называется

<ace:column headerText="Start Date" rendered="#{not alliance.deletePending}"> 
    <ace:dateTimeEntry id="startDateField" value="#{alliance.allianceStartDate}" pattern="dd/MMM/yyyy" renderAsPopup="true" effect="fadeIn"> 
     <ace:ajax execute="@this" render="@this" event="dateSelect" listener="#{allianceViewBean.changeAllianceActiveIndicator}"/> 
     <ace:ajax execute="@this" render="@this" event="dateTextChange" listener="#{allianceViewBean.changeAllianceActiveIndicator}"/> 
    </ace:dateTimeEntry> 
</ace:column> 

Я использую тег, который вызывает метод слушателя в бина называется

#{allianceViewBean.changeAllianceActiveIndicator} 

Это метод изменения значения боб:

public void changeAllianceActiveIndicator(AjaxBehaviorEvent event) { 
    TimeZone.setDefault(TimeZone.getTimeZone("UTC")); 

    Calendar c = Calendar.getInstance(); 
    c.setTimeZone(TimeZone.getTimeZone("UTC")); 

    java.util.Date currentDate = c.getTime(); 

    for (AllianceBean bean : carrierAllianceDetails) { 
     if ((bean.getAllianceStartDate().compareTo(currentDate) < 0) 
      && (bean.getAllianceEndDate().compareTo(currentDate) > 0)) { 
      bean.setActive(true); 
     } else { 
      bean.setActive(false); 
     } 
    } 
} 

Однако, когда я отладить этот метод ошибки. Слушатель правильно достигает метода, но значение даты начала в компоненте не является обновленным значением, и оно по-прежнему относится к старому значению перед изменением. Если я ввожу новое значение в форму, значение в компоненте всегда ссылается на ранее введенное значение даты. Логика правильная в методе, но проверяемые значения не являются.

Я не уверен, как обеспечить, чтобы метод слушателя извлекал последнее значение из формы.

Благодаря

+0

Похоже, что прослушиватель «dateTextChange» работает, когда вводится дата. Однако прослушиватель «dateSelect» не обновляет значение bean-компонента, когда выбрана дата, из формы . – LiamWilson94

+0

В принципе, я хотел бы установить свойство bean перед прослушивателем ajax. – LiamWilson94

ответ

0

Это связано с фазой жизненного цикла вы находитесь. Проверьте фазы жизненного цикла, в котором это событие приходит. Если он до фазы UPDATE_MODEL_VALUES (например, в фазе PROCESS_VALIDATIONS), то ваши значения фасоли просто не обновляется. В этом случае я бы рекомендовал установить phaseId к INVOKE_APPLICATION на события, его в очередь и возвращает метод:

public void changeAllianceActiveIndicator(AjaxBehaviorEvent event) { 
    if (!event.getPhaseId().equals(PhaseId.INVOKE_APPLICATION) { 
     event.setPhaseId(PhaseId.INVOKE_APPLICATION); 
     event.queue(); 
     return; 
    } 

    TimeZone.setDefault(TimeZone.getTimeZone("UTC")); 

    Calendar c = Calendar.getInstance(); 
    c.setTimeZone(TimeZone.getTimeZone("UTC")); 

    java.util.Date currentDate = c.getTime(); 

    for (AllianceBean bean : carrierAllianceDetails) { 
     if ((bean.getAllianceStartDate().compareTo(currentDate) < 0) 
      && (bean.getAllianceEndDate().compareTo(currentDate) > 0)) { 
      bean.setActive(true); 
     } else { 
      bean.setActive(false); 
     } 
    } 
} 

Кроме того код вашего метода не является идеальным либо. Установка значения по умолчанию timeZone довольно устарела - также весь блок календаря. Вы можете просто сделать

Date currentDate = new Date(); 

Я также рекомендовал бы, чтобы преобразовать дату, которая устанавливается на боб на сегодняшний день сервера TimeZone в - в противном случае вы сравниваете яблоки и апельсины.

 Смежные вопросы

  • Нет связанных вопросов^_^