Проблема valueChangeListener и ajax в порядке выполнения в selectOneMenu - PullRequest
5 голосов
/ 18 апреля 2011

В настоящее время я наблюдаю странное явление, когда установка значения для модели происходит перед выполнением valueChangeListener.

По сути, я бы хотел, чтобы это произошло:

  1. Я меняю меню выбора
  2. Новое значение передается с использованием Ajax для обновления myBean (с использованием f: ajax)
  3. Выполнить запрос на основе вновь отправленного значения (используя valueChangeListener)
  4. Визуализация таблицы на основе результата последнего запроса

Но то, что происходит, когда я бегу, происходит в следующем порядке: 1 - 3 - 2 - 4 (а не 1 - 2 - 3 - 4, как я себе представлял)

Вот часть пользовательского интерфейса:

<h:selectOneMenu label="budget" id="budget"
    converter="genericConverter"
    value="#{myBean.budget}" 
    valueChangeListener="#{myBean.actionSearch}">

    <f:ajax render="myGrid" />
    <f:selectItem itemLabel="Choose one .." noSelectionOption="true" />

    <f:selectItems ... />
</h:selectOneMenu>

А вот выдержка из боба:

public void actionSearch() {
    System.out.println("searching with this.budget == " + this.budget);
    ...
}
public void setBudget(String budget) {
    System.out.println("setting budget : " + budget);
    this.budget = budget;
}

И это вывод:

searching with this.budget == xxxx
setting budget : yyyy

Что я хотел бы, так это установить бюджет сначала из нового значения, выбранного в пользовательском интерфейсе, а затем начать поиск на основе нового пользовательского интерфейса. Но я не знаю, как этого добиться.

И я использую Tomcat 7 вместе с этими:

<dependency>
    <groupId>org.primefaces</groupId>
    <artifactId>primefaces</artifactId>
    <version>2.2.1</version>
</dependency>
<dependency>
    <groupId>com.sun.faces</groupId>
    <artifactId>jsf-api</artifactId>
    <version>2.0.4-b09</version>
    <scope>compile</scope>
</dependency>
<dependency>
    <groupId>com.sun.faces</groupId>
    <artifactId>jsf-impl</artifactId>
    <version>2.0.4-b09</version>
    <scope>compile</scope>
</dependency>

Интересно, что я сделал не так?

Спасибо!

1 Ответ

15 голосов
/ 18 апреля 2011

valueChangeListener выполняется на этапе проверки, до этапа обновления значений модели.Предполагается, что он сможет получить дескриптор как старого, так и нового значения, чтобы вы могли при необходимости выполнить некоторые деловые операции (ведение журнала?) На основе изменения real .В JSF 1.x это, однако, более чем часто (ab) использовалось для вызова действий только при выпадающем изменении, но оно должно использоваться в сочетании с onchange="submit()", immediate="true", FacesContext#renderResponse()и другие вещи.Выбранное значение должно быть получено с помощью ValueChangeEvent#getNewValue() (ValueChangeEvent должно быть определено как аргумент метода).

Для JSF 2.x выв таком случае valueChangeListener больше не нужен.Вы также не заинтересованы в старой ценности в любом случае.Вместо этого используйте атрибут listener <f:ajax>.

<f:ajax listener="#{bean.actionSearch}" />

Это будет выполнено во время фазы действия Invoke, после Этап обновления значений модели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...