Таблица данных JSF с selectOneListbox - PullRequest
2 голосов
/ 10 мая 2011

У меня есть dataTable, в котором перечислены некоторые объекты, и я хочу установить свойство для этих объектов с помощью selectOneListbox. Это моя таблица данных

<h:dataTable value="#{someHandler.entities}"
                binding="#{someHandler.dataTable}" var="entitiy">
               <h:column>
                    <f:facet name="header">
                        <t:outputText value="Level" />
                    </f:facet>
                    <h:selectOneListbox id="level" value="#{entitiy.level}" size="1"
                        valueChangeListener="#{someHandler.changeLevel}"
                        onchange="submit()">
                        <f:selectItem itemValue="-" itemLabel="-" />
                        <f:selectItem itemValue="ALL" itemLabel="ALL" />
                        (and so on)
                    </h:selectOneListbox>
                </h:column>
                <h:column>
                    <f:facet name="header">
                        <t:outputText value="Name" />
                    </f:facet>
                    <h:outputText value="#{entitiy.name}" />
                </h:column>
</h:dataTable>

ValueChangeListener выглядит так:

public void changeLevel(ValueChangeEvent event) {
    String newLevel = (String) event.getNewValue();
    Logger logger = (Logger) dataTable.getRowData();        
    logger.setLevel(Level.toLevel(newLevel));
}

(dataTable является объектом HtmlDataTable.)

Тем не менее, объект события всегда один и тот же - независимо от того, в какой строке находился selectOneListbox. (Кажется, всегда регистратор в первой строке). Получаемый мной объект Logger тоже не тот, который мне нужен.

Есть идеи? Спасибо!

А чужие вопросы? Вызывается ли метод authoriy.setLevel (), хотя у меня есть valueChangeListener? Я использую authoriy.level, потому что я хочу показать выбранный уровень по умолчанию для этих объектов.

Спасибо!

1 Ответ

3 голосов
/ 10 мая 2011

Здесь есть две потенциальные проблемы:


Сначала onchange="submit()" отправляет всю форму.valueChangeListener будет вызываться для всех элементов ввода, значение представленных которых отличается от значения initial .

Необходимо выполнить предварительную настройкузначение позади #{entitiy.level} с тем же значением, что и опция меню по умолчанию.Например, в конструкторе.

public Entity() {
    level = "-";
}

Или, что лучше, задайте значение по умолчанию null.

<f:selectItem itemValue="#{null}" itemLabel="-" />

, чтобы valueChangeListener не вызывалось, когда конкретное менюне изменяется.

Или, если вы уже пользуетесь JSF 2.x (пожалуйста, всегда указывайте точную версию / версию JSF в своих вопросах JSF), вы можете использовать для этого тег <f:ajax> без необходимостиvalueChangeListener с взломом onchange="submit()".


Во-вторых, вам нужно убедиться, что значение #{someHandler.entities}, в котором можно датировать, возвращает точно тот же список во время отправки, каким он был во времяначальный запрос.Итак, загрузите данные в конструкторе bean (post).В JSF 2.x вы также хотели бы поместить компонент в область просмотра.


Не имеет отношения к конкретной проблеме , вместо этого вы можете просто использовать <h:selectOneMenu><h:selectOneListbox size="1">.

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