JSF2.0 - h: dataTable со столбцом, содержащим раскрывающийся список - проблема с отображением / скрытием раскрывающегося списка для каждой строки таблицы - PullRequest
2 голосов
/ 07 июня 2011

У меня есть таблица, в которой один из столбцов содержит раскрывающийся список (компонент HtmlSelectItems).Для любой строки в этой таблице я хочу иметь возможность отображать или скрывать раскрывающийся список во время выполнения в зависимости от конкретных условий приложения.

Мое решение в этом случае состояло в том, чтобы использовать механизм прослушивания событий компонента перед визуализациейобеспечивается реализацией JSF2.0.По сути, на странице JSF я назначил идентификатор компоненту HtmlSelectItems (который находится внутри столбца ah:) и установил его с помощью элемента pre: render f: event.Событие f: указывает на один из моих методов, который получает идентификатор компонента и обрабатывает его.

Моя проблема заключается в том, что экземпляр HtmlSelectItems ОБЩЕН между всеми строками таблицы, и если, скажем, я вызываю HtmlSelectItems.setRender (false) для одного компонента раскрывающегося списка, все последующие строки перестанут отображать раскрывающиеся списки.На самом деле слушатель предварительного рендеринга f: event перестанет вызываться после вызова первого setRender (false) в раскрывающемся списке

. Я могу понять тот факт, что совместное использование одного экземпляра HtmlSelectItems между строками таблицы оказывает положительное влияние наобщая производительность, но не должен ли этот экземпляр компонента повторно инициализироваться в каждой строке?

Большое спасибо за любые разъяснения на этот счет.

1 Ответ

1 голос
/ 07 июня 2011

Вы должны позволить условию rendered зависеть от самой строки, а не от родительского компонента.

Например,

<h:dataTable value="#{bean.list}" var="item">
    <h:column>
        <h:selectOneMenu rendered="#{item.showDropdown}">
            ...
        </h:selectOneMenu>
    </h:column>
</h:dataTable>

вместо

<h:dataTable value="#{bean.list}" var="item">
    <h:column>
        <h:selectOneMenu rendered="#{bean.showDropdown}">
            ...
        </h:selectOneMenu>
    </h:column>
</h:dataTable>

Или если его нужно определить #{bean}, а не #{item} из-за некоторых конструктивных ограничений, то есть несколько способов.

Если вы используете DataModel в качестве элемента данных value, то вы можете получить текущую строку следующим образом:

public boolean isShowDropdown() {
    Item item = model.getRowData();
    return shouldShowDropdown(item); // Do your thing.
}

Если нет, то сохранитеMap<Long, Boolean> вместо этого, где ключ фактически является идентификатором элемента строки, а значение представляет, должен ли быть показан раскрывающийся список.Это может быть использовано следующим образом:

<h:dataTable value="#{bean.list}" var="item">
    <h:column>
        <h:selectOneMenu rendered="#{bean.showDropdown[item.id]}">
            ...
        </h:selectOneMenu>
    </h:column>
</h:dataTable>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...