Получение выбранного значения SelectOneMenu

Я тестирую компонент "SelectOneMenu" на странице jsf. Я динамически заполняю этот компонент через свой ManageBean (который будет получать всех животных из базы данных).

Я хотел бы знать, возможно ли увидеть выбранный пользователем элемент этого «SelectOneMenu» (поле со списком), я пытаюсь использовать значение = «# {animalsManage.animalSelect}», но он вызывается только в начале страницы. Кроме того, я использую inputText, чтобы увидеть значение выбранного элемента «SelectOneMenu».

Что я делаю неправильно?

JSF:

    <body>
    <ui:component>
        <h:form>
                    <h:outputText value="Select one Mets File" />
                    <h:selectOneMenu id="combo" value="#{animalsManage.animalSelected}">
                        <f:selectItem itemLabel="Select..."  noSelectionOption="true"/>
                        <f:selectItems value="#{animalsManage.allAnimals}" />
                    </h:selectOneMenu>
                    <h:inputText id="textbox" value="#{animalsManage.animalSelected }" />
        </h:form>
    </ui:component>
</body>

Управление компонентом:

    @ManagedBean
    @ViewScoped
    public class AnimalsManage implements Serializable {

    @EJB
    private AnimalsFacadeREST animalsFacadeREST;
    private String animalSelected;
    private List< SelectItem> selectAnimals;

    public List<SelectItem> getAllAnimals() {
            List<Animals> al = animalsFacadeREST.findAll();
            selectAnimals = new ArrayList< SelectItem>();
            int i = 0;
            for (Animals animal: al) {
                selectAnimals.add(new SelectItem(i, animal.getName()));
                i++;
            }
            return selectAnimals;
    }

    public String getAnimalSelected() {
       return animalSelected;
    }

    public void setAnimalSelected(String animalSelected) {
        this.animalSelected = animalSelected;
    }
}

person iGoDa    schedule 12.02.2013    source источник
comment
вы можете просто добавить f:ajax внутрь ‹h:selectOneMenu› с событием как изменением, а также указать атрибут рендеринга со значением @form. Это может показать выбранное вами значение в текстовом поле. Что-то вроде этого ‹f:ajax event=change render=@form› . Попробуй.   -  person h-kach    schedule 12.02.2013
comment
Что такое #{fileManage.fileName}? Кстати, <h:selectOneMenu> отображает раскрывающийся список, а не поле со списком. Получите ваши термины прямо. И последнее, но не менее важное: выполнение бизнес-логики в геттере — это плохо. Чтобы получить некоторые подсказки о том, как правильно использовать <h:selectOneMenu>, проверьте его вики-страницу (наведите указатель мыши поверх тега [selectonemenu], который вы разместили в вопросе, пока не появится черный ящик, а затем щелкните ссылку info). ).   -  person BalusC    schedule 12.02.2013
comment
Спасибо hemanth, это помогло. Кроме того, спасибо BalusC, я отредактировал текст, надеюсь, теперь все в порядке.   -  person iGoDa    schedule 12.02.2013


Ответы (1)


Решений представленной проблемы множество. Я представляю здесь две основные идеи.

  1. Серверное решение. Просто прикрепите тег <f:ajax> к вашему <h:selectOneMenu>, чтобы обновить выбранные значения и повторно отобразить выбор пользователя, как в

    <h:selectOneMenu id="combo" value="#{animalsManage.animalSelected}">
        <f:selectItem itemLabel="Select..."  noSelectionOption="true"/>
        <f:selectItems value="#{animalsManage.allAnimals}" />
        <f:ajax execute="combo" render="textbox" />
    </h:selectOneMenu>
    <h:inputText id="textbox" value="#{animalsManage.animalSelected }" />
    

    Если хотите, вы также можете выполнить некоторую пользовательскую логику с выбранным элементом в прослушивателе ajax, указав тег listener="#{animalsManage.performCustomAjaxLogic}" of <f:ajax>.

  2. Клиентское решение. Просто обновите элемент с id="textbox" в основном событии изменения. Итак, если вы используете jQuery, решение будет

    $('#combo').change(function() {
        $('#textbox').val($('#combo').val());
    });
    

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

person skuntsel    schedule 12.02.2013
comment
Спасибо, это сработало! Я предпочел использовать прослушиватель с ajax, чтобы получить то, что хотел. Кроме того, у меня была проблема с mojarra, не было определено, что заставило сервер остановиться и не смог запустить мой код. - person iGoDa; 12.02.2013