Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: iGoDaОтветов: 1

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

jsf-2managed-beanselectonemenu

Ответы

Ответ 1 · рейтинг 12 · skuntsel

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

  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());
    });
    

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы