JSF - принудительно обновлять компоненты UIInput - PullRequest
2 голосов
/ 24 декабря 2009

В настоящее время я работаю над проектом JSF 1.2 (реализация IBM и «уровень компании»).

ПРОБЛЕМА

Вот ситуация (количество предметов только для примера), простой CRUD

  1. Элемент списка
  2. У меня есть список предметов
  3. Я нажимаю на пункт 2, чтобы увидеть детали
  4. Я нажимаю изменить, на странице модификации отображаются значения элемента 2
  5. Вернуться к списку с помощью кнопки «Назад» и immediate="true" (потому что мы не хотим вносить изменения)
  6. Деталь позиции 4
  7. Изменить элемент 4> Отображаются значения элемента 2

НО

  • если я установлю атрибут «немедленное» кнопки «Назад» на false, значения элемента 4 будут в порядке.
  • если я установлю для «отключенного» атрибута компонента inputText значение true, значение элемента 4 будет в порядке.
  • , если я использую <h:outputText value="#{item4.myValue}/> (UIOutput) вместо <h:inputText value="#{item4.myValue}/> (UIInput)

Кроме того, я проверил в режиме отладки, что bean-компонент, который я хотел отобразить, был "item 4", и это было.

Что я нашел

После некоторых исследований в Google я обнаружил, что эта проблема возникает из жизненного цикла JSF , хотя найденная документация и решения относятся к конкретным реализациям JSF. Так что я думаю, это потому, что значение заполняется с помощью localValue вместо submitValue (@see интерфейс EditableValueHolder может помочь в понимании), и на этих страницах есть некоторые решения

РЕЗУЛЬТАТ

Это не работает (меня бы здесь не было, клянусь ^^). Решение «Обновить» неэффективно. «Стереть вход» страшно. Я не могу признать, что мне нужно ссылаться на каждое поле ввода! Кроме того, я не нашел метод setSubmittedValue() для UIInput в моем IBM JSF. «Чистый» метод неэффективен. Я попробовал один элемент и полное дерево компонентов с этим кодом

public void cleanAllChildren(List<UIComponentBase> list){
 for(UIComponentBase c : list){
  this.cleanAllChildren(c.getChildren());
  c.getChildren().clear();
 }
}

Но безуспешно. И вот я здесь. Я что-то пропустил? Есть ли хорошее хитрое решение, которое я не видел? Я не очень знаком с жизненным циклом JSF.

1 Ответ

2 голосов
/ 24 декабря 2009

Помещение компонента с данными в области запроса в область запроса, а не в область сеанса.

Вероятно, у вас есть весь список в сеансе для «сохранения» вызовов БД и вся работа по сохранению значений в последующих запросах внутри того же сеанса. Для этого вы можете использовать отдельный сессионный компонент, например DataManager. Затем у вас должен быть bean-объект области видимости для представления выбранного элемента, например, DataItem. Вы можете познакомиться с обоими компонентами с помощью внедрения управляемых свойств.

...