f: viewParam потерян после вызова ajax

У меня есть этот f:viewParam для установки значения и выполнения поиска в обратном компоненте:

<f:metadata>
<f:viewParam name="id"
    value="#{editorBean.id}"
    required="true" />
<f:event type="preRenderComponent"
    listener="#{editorBean.search}" />
...

Задний боб:

private String id; // getters setters

public void search(ComponentSystemEvent event) {


    if (id != null) {
            //search data in DB to construct TreeNode finBy(id)...
...

В браузере я не могу расширить второй уровень дерева, потому что при поддержке Bean идентификатор равен нулю.

введите здесь описание изображения

Отлаживать:

введите здесь описание изображения

Как установить f:viewParam во всех вызовах?


person Eric Garcia    schedule 24.05.2013    source источник


Ответы (1)


Это вызвано тем, что <h:form> по умолчанию отправляет URL-адрес без строки запроса.

Либо поместите компонент в область просмотра,

@ManagedBean
@ViewScoped
public class EditorBean {

и пропустить пререндеринг во время постбека

public void search(ComponentSystemEvent event) {   
    if (FacesContext.getCurrentInstance().isPostback()) {
        return;
    }

    // ...
} 

Компонент с областью действия представления существует до тех пор, пока вы взаимодействуете с одним и тем же представлением, и поэтому свойства не нужно инициализировать снова и снова.

Или используйте OmniFaces <o:form>, который предлагает атрибут includeViewParams для включения параметров просмотра в URL-адрес действия формы:

<o:form includeViewParams="true">

Смотрите также:

person BalusC    schedule 24.05.2013
comment
Я использую Spring Beans. Область просмотра не существует - person Eric Garcia; 24.05.2013
comment
Тогда просто выберите альтернативу. - person BalusC; 24.05.2013
comment
@BalusC: Имеет ли смысл, как описано в названии, это происходит после второго звонка? Логика и ваш ответ наводят меня на мысль, что это происходит после первого, точнее во время первого ajax-вызова. Я собираюсь создать тестовый пример, но stackoverflow.com/questions/61762633/ уже имеет такое поведение. Название случайно неправильное или могло быть таким в прежние дни, и поведение, которое мы наблюдаем сегодня, является более логичным? - person Kukeltje; 19.05.2020
comment
@Kukeltje: вы правы, название было двусмысленным. ОП, вероятно, имел в виду после второго запроса. Это произойдет, когда вы откроете страницу в обычном режиме, а затем запустите на ней обратную передачу. - person BalusC; 20.05.2020
comment
@BalusC: Кажется, исходное название было правильным. Я пробовал stackoverflow.com/questions/61762633/ в Mojarra 2.3.9SP02 (Wildfly 16) и при первом вызове ajax он действительно не передается, но.... Вызывается сеттер IS. В настоящее время я проверяю, связано ли это с stackoverflow.com/questions/10692404 и указанным stackoverflow.com/questions/3933786 В этом github.com/javaserverfaces/mojarra/issues/2266 упоминается. Я проверяю, связано ли это, но, может быть, вы знаете. - person Kukeltje; 24.05.2020
comment
o:viewParam работает кстати, и в o:viewParam есть много информации о поведении обратной передачи и ссылках на проблемы в JSF ‹= 2.2 и интерпретация нулевой активации в 2.3, но все же странно, почему это происходит один раз при обратной передаче, а не всегда... (или никогда) - person Kukeltje; 24.05.2020