JSF2: невозможно получить данные из HtmlSelectOneMenu в коде Java - PullRequest
1 голос
/ 19 марта 2012

Я работаю с MyFaces / Primefaces, и у меня проблема с получением информации с использованием ajax.Моя страница содержит список панелей, внутри каждой панели пользователь может выбрать значение в раскрывающемся списке и щелкнуть по флажку, который обновит его панель (Ajax), надеюсь, у меня все ясно.Это мой код:

<p:panel>
...
<h:selectOneMenu id="beanSet" value="#{myBean.selectedSet}">
    <f:selectItem itemLabel=" " noSelectionOption="true" />
    <f:selectItems value="#{langSet}" />
</h:selectOneMenu>


<h:selectBooleanCheckbox 
id="chkbxBeanSet"
value="#{myBean.selectedSetChkbx}" >
    <p:ajax 
    event="click" render="@parent"
    listener="#{action.updateSet}"
    execute="@form"
    immediate="true"
    />
</h:selectBooleanCheckbox>
...
<p:panel>

А вот мой код Java:

public void updateSet(AjaxBehaviorEvent e) {
    UIComponent source = (UIComponent)e.getSource();
    System.out.println("Value:"+((HtmlSelectBooleanCheckbox)source).getValue());
    UIComponent parent = source.getParent();
    List<UIComponent> children = parent.getChildren();


    HtmlSelectOneMenu lvSet = (HtmlSelectOneMenu)parent.findComponent("beanSet");
    Object value = lvSet.getValue();
    System.out.println("value: " + value);

Я получаю компонент beanSet, но не могу получить его значение.Как я понимаю, getValue вызывает getSelectedSet из myBean, который не установлен (это находится в области запроса).Я не понимаю, как я могу получить выбранное значение в раскрывающемся списке с помощью ajax.Другой способ - опубликовать всю форму, но в этом случае я должен определить, какой флажок был нажат пользователем ... Если кто-то может объяснить мне, где я ошибаюсь?

Ответы [ 2 ]

2 голосов
/ 19 марта 2012

Виновником является immediate="true" в действии Ajax. Это пропустит все входные компоненты, для которых , а не , этот атрибут установлен во время обработки. Вы должны точно настроить компоненты для обработки в атрибуте process <p:ajax>. Да, другой виновник в том, что вы использовали execute вместо process. <p:ajax> использует process, где <f:ajax> использует execute. Кроме того, способ, которым вы получили доступ к раскрывающемуся значению, излишне усложняется. Просто получите доступ к свойству selectedSet напрямую. JSF все равно установит его в один и тот же компонент.

Итак, это должно сделать

<h:selectOneMenu id="beanSet" value="#{myBean.selectedSet}">
    <f:selectItem itemLabel=" " noSelectionOption="true" />
    <f:selectItems value="#{langSet}" />
</h:selectOneMenu>
<h:selectBooleanCheckbox id="chkbxBeanSet" value="#{myBean.selectedSetChkbx}">
    <p:ajax process="@this beanSet" listener="#{action.updateSet}" update="@parent" />
</h:selectBooleanCheckbox>

с

public void updateSet() {
    System.out.println(selectedSet);
}

Обратите внимание, что я опустил event="click" из <p:ajax>. Это уже по умолчанию для флажков.

0 голосов
/ 19 марта 2012

поместите это (слушатель необязателен), <f:ajax event="change" - это то, что вам нужно больше всего

<f:ajax event="change" render="IdsOfComponentToRender" listener="#{myBean.someMethod}" />

внутри вашего <h:selectOneMenu id="beanSet" value="#{myBean.selectedSet}">

это подпись слушателя

public void someMethod(AjaxBehaviorEvent ev) {...

b.t.w, что это за метод updateLvSet, и где вы его называете, и вам не следует обращаться к таким данным таким образом ...

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