2015-12-04 114 views
0

我目前正在將一個遺留項目從JSF 1(使用RichFaces 3)遷移到JSF 2(使用RichFaces 4)。該項目有幾個豐富的:dataTables複選框旁邊的項目。在頁面的底部,有幾個操作按鈕可以顯示所有選定項目的內容(添加到收藏夾,導出爲PDF,...)。如何在沒有綁定的情況下使用rich:dataTable與行選擇

複選框是rich:dataTables綁定到相應的UI bean的原因。但是大部分UI bean都是會話範圍的。在這之間,我瞭解到綁定與會話範圍並不是一個好主意。事實上,如果我將範圍更改爲「請求」,我會有很多「重複的ID」錯誤消失。但這並不容易。這些有一些狀態需要在請求和精心設計的狀態初始化和清理邏輯之間保留。

我想我有兩個選擇:

  1. 變化豆請求範圍的,通過提取狀態進入一些新的「stateObjects」被保存在一個新的「一個sessionBean」做一些大規模的重構,並完全重寫狀態邏輯

  2. 刪除綁定,但我怎樣才能確定哪些條目的富:dataTable的複選框被選中?

Curiosly,會話範圍和綁定一起工作得很好,JSF 1和使豆會話範圍的決定是很長一段時間我才接手該項目。

回答

1

您可以刪除綁定並更改操作(不需要更改bean範圍)。

1)簡單情況下:與產品清單和行選擇細節對於選擇的項目被顯示

按照實施例後的數據表使用的Javascript(在豆存儲項ID和呼叫動作用於呈現相關數據此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 
} 

在我的代碼有equalshashCode方法爲PickerItem類的拍,但它應該不它也能工作。

相關問題