2015-12-04 1 views
0

В настоящее время я переношу старый проект из JSF 1 (с RichFaces 3) в JSF 2 (с RichFaces 4). Проект имеет несколько богатых: dataTables с флажками рядом с элементами. В нижней части страницы есть несколько кнопок действий для чего-то со всеми выбранными элементами (добавить в избранное, экспортировать как PDF, ...).Как использовать rich: dataTable с выбором строки без привязки

Эти флажки являются причиной того, почему богатые: dataTables имеют привязку к соответствующим компонентам пользовательского интерфейса. Но большинство компонентов пользовательского интерфейса ограничены сеансом. Между тем, я узнал, что привязка в сочетании с областью сеанса - не очень хорошая идея. И действительно, у меня много ошибок «повторного идентификатора», которые исчезают, если я изменю область действия на «запрос». Но это не так просто. Эти beens имеют некоторое состояние, которое должно быть сохранено между запросами и разработанной логикой инициализации состояния и очистки.

Я думаю, что у меня есть два варианта:

  1. изменение бобы в запрос-сфере, сделать какой-то массивный рефакторинг путем извлечения состояния в некотором новый «stateObjects», чтобы сохранить в новом «SessionBean», и полностью переписать логику состояния

  2. удалить привязки, но как определить, какие записи богатых: dataTable имеют свои флажки?

Curiosly, сессия-сфера и привязки вместе работали очень хорошо с JSF 1. И решение для изготовления Сеансных-контекстного было сделано много времени, прежде чем я взял на себя проект.

ответ

1

Вы можете удалить действия привязки и изменения (изменение области видимости не требуется).

1) Простой случай: данные таблицы со списком элементов, и после того, как деталь выбора строки для выбранного элемента отображается

Следующего примера использует Java- (сохранение идентификатора элемента в компоненте и вызов действия для представления данных, относящихся для этого ID):

<a4j:jsFunction name="selectRow" action="#{locationAction.showSelectedLocation}"> 
    <a4j:param name="locationId" assignTo="#{locationAction.selectedLocationId}" /> 
</a4j:jsFunction> 

<rich:dataTable id="locationTable" 
    value="#{locationAction.locationList}" var="location" 
    rows="#{referenceData.recordsPerPage}" 
    onrowclick="selectRow('#{location.locationId}')"> 
    ... 
</rich:dataTable> 

2) корпус с несколькими флажков и кнопки действий:

<rich:dataTable id="productTable" var="res" 
    value="#{productPicker.pickerList}"> 
    ... 
    <rich:column> 
     <h:selectBooleanCheckbox id="selectChck" value="#{res.selected}" /> 
    </rich:column> 
    ... 
</rich:dataTable> 
<a4j:commandButton value="#{msg.detachSelected}" 
    action="#{productPicker.deleteSelectedFromPickerList}" 
    render="picker" /> 

где элемент списка является private List<PickerItem> pickerList; и элемент из

public class PickerItem { 
    private Long id; // with getter and setter 
    // private Record item; // with getter and setter 
    private boolean selected; // with getter and setter 
} 

В моем коде есть equals и hashCode методы, как погладить класса PickerItem, но она должна работать без него тоже.

Смежные вопросы