Primefaces selectOneMenu не сохраняет фокус на выбранном элементе при повторном открытии

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

    <p:selectOneMenu id="countryMenu" value="#{myBean.selectedCountry}">
        <f:selectItem value="#{null}" itemLabel="Please select a Country..."/>
        <f:selectItems value="#{myBean.countries}" var="country" 
                       itemValue="#{country.code}" 
                       itemLabel="#{country.name}"/>
        <p:ajax update="anotherComponent"/>
    </p:selectOneMenu>

и я выбираю страну из списка, затем снова нажимаю на меню, он отображает список стран с самого начала. Он действительно сохраняет выбранную страну — он просто не прокручивает вниз и не фокусируется на ней.

Стандартный JSF h:selectOneMenu отображает ожидаемое поведение — он открывается с видимой ранее выбранной страной.

Есть какая-то хитрость или это баг?

У него также есть ряд других особенностей, связанных с тем, как он реагирует на ввод с клавиатуры. (например, нажатие вверх/вниз, когда меню находится в фокусе, не открывает меню), что немного расстраивает.

Я использую:

  • Перволики 3.1
  • Стеклянная рыба 3.1.1
  • NetBeans 7.1

person James Bassett    schedule 13.02.2012    source источник
comment
Ну, это явно ошибка (по крайней мере, отсутствие функции) в PrimeFaces, и вы, вероятно, уже знаете об этом. Здесь мы мало что можем сделать для вас, кроме как предложить вам сообщить об ошибке там или переписать/переопределить средство визуализации и/или JavaScript.   -  person BalusC    schedule 13.02.2012
comment
К вашему сведению, вы можете искать и/или сообщать о проблемах с Primefaces здесь: code.google.com /p/primefaces/проблемы/список   -  person maple_shaft    schedule 13.02.2012
comment
@maple_shaft Да, я посмотрел, прежде чем публиковать этот вопрос, но текущих проблем, связанных с этим, нет. Я просто хотел убедиться, что это действительно ошибка, прежде чем публиковать проблему.   -  person James Bassett    schedule 14.02.2012
comment
Хорошо, это все еще происходит в 3.4, поэтому я поднял проблему   -  person James Bassett    schedule 27.09.2012


Ответы (3)


Это не ошибка. Вам просто нужно переопределить методы equalsTo(Object o) и compareTo(Object o) в классе Country.

Это будет работать нормально после того, как вы это сделаете.

person skouda    schedule 30.03.2012
comment
Это не объясняет, почему это работает в h:selectOneMenu. compareTo() не нужен, он не будет использоваться. equalsTo() не существует, я предполагаю, что вы имеете в виду equals(). Но если бы это отсутствовало или было бы плохо реализовано, h:selectOneMenu тоже бы не получилось. - person BalusC; 30.03.2012
comment
Точно такую ​​же проблему можно увидеть на витрине Primefaces (пример 'pojo' на primefaces. org/showcase/ui/selectOneMenu.jsf). На днях отчитаюсь. О, и BalusC - спасибо за ваш неутомимый ответ SO, почти в каждой полезной статье JSF, которую я нахожу, где-то есть ваше имя! - person James Bassett; 31.03.2012

Если вы обновитесь до Primefaces 3.4 (актуальная версия на данный момент), у вас все еще будет подобное поведение, чего не ожидается.

Событие, если первый элемент имеет noSelectionOption="true", вы получаете такое же поведение, которое кажется ошибкой при проверке, и о ней сообщается здесь и здесь. Также на форуме есть тема об этом.

Но вы можете попробовать использовать свойство itemDisabled, так как оно решило эту проблему для меня:

<p:selectOneMenu id="hero" value="#{bean.hero}">
    <f:selectItem itemLabel="Select..." itemDisabled="true" />
    <f:selectItems var="item" value="#{bean.heroes}" itemLabel="#{item.name}" />
</p:selectOneMenu>

Я надеюсь, что это помогает.

person rbento    schedule 25.09.2012
comment
Эти проблемы кажутся не связанными, и itemDisabled не имеет значения. Я поднял вопрос, так что, надеюсь, он скоро будет исправлен :) - person James Bassett; 27.09.2012

Хорошо, кажется, это было исправлено!

Я провел несколько тестов с различными версиями Primefaces со следующими результатами:

  • 3.1 - не работает

  • 3.2 - не работает

  • 3.3 - не сработало (предыдущее выбранное значение кратковременно мерцает, затем отображается первый пункт меню)

  • 3.4 - работает как положено

Примечание. Мне нужно было очистить кеш браузера (в Chrome и Firefox) при обновлении с 3.3 до 3.4 (элементы вообще нельзя было выбрать, пока я не сделал это).

person James Bassett    schedule 26.11.2012