Giải pháp hiện tại không tấn công tôi như một giải pháp tồi. RowIndex nên làm việc trong các bảng lồng nhau, miễn là bạn đang tham chiếu đến mô hình của bảng lồng nhau. mô hình
<h:dataTable border="1" value="#{nestedDataModel}" var="nested">
<h:column>
<h:dataTable border="1" value="#{nested}" var="item">
<h:column>
<h:outputText value="#{nested.rowIndex}" />
</h:column>
<h:column>
<h:outputText value="#{item}" />
</h:column>
</h:dataTable>
</h:column>
</h:dataTable>
mẫu:
public class NestedDataModel extends DataModel implements Serializable {
private List<List<String>> nestedDataModel = populateModel();
private int index;
private List<List<String>> populateModel() {
List<List<String>> list = new ArrayList<List<String>>();
for(int x=0; x<3; x++) {
List<String> nestedTableData = new ArrayList<String>();
for(int y=0; y<3; y++) {
nestedTableData.add("Foo x="+x+" y="+y);
}
list.add(nestedTableData);
}
return list;
}
@Override
public int getRowCount() {
return nestedDataModel.size();
}
@Override
public Object getRowData() {
List<String> list = nestedDataModel.get(index);
return new ListDataModel(list);
}
@Override
public int getRowIndex() {
return index;
}
@Override
public Object getWrappedData() {
return nestedDataModel;
}
@Override
public boolean isRowAvailable() {
return index >= 0 && index < nestedDataModel.size();
}
@Override
public void setRowIndex(int arg0) {
index = arg0;
}
@Override
public void setWrappedData(Object arg0) {
throw new UnsupportedOperationException();
}
}
DataTables làm tổ thường nên tránh - nếu bạn không cẩn thận (ví dụ như làm cho họ con của một hình thức), điều này có thể dẫn đến một O (N^2) vượt qua các bảng trẻ em cho mỗi giai đoạn của vòng đời trên một trình (và có 6 giai đoạn trong vòng đời).
Đối với một cái gì đó bên ngoài để các mô hình, bạn có thể sử dụng một bộ đếm đơn giản trong một bean được quản lý:
public class RowCounter implements Serializable {
private transient int row = 0;
public int getRow() {
return ++row;
}
}
Config:
<managed-bean>
<managed-bean-name>rowCounter</managed-bean-name>
<managed-bean-class>tablerows.RowCounter</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
Xem:
<f:view>
<h:dataTable border="1" value="#{tableDataBean.tableDataModel}"
var="rowBean">
<h:column>
<h:outputText value="#{rowCounter.row}" />
</h:column>
<h:column>
<h:outputText value="#{rowBean}" />
</h:column>
</h:dataTable>
</f:view>
Điều này hoạt động vì hạt đậu s phạm vi yêu cầu và ràng buộc với một điều khiển chỉ đọc bên ngoài một biểu mẫu. Nó sẽ không làm việc trong một dataTable lồng nhau trừ khi bạn muốn các hàng truy cập được toàn cầu để xem. Nhưng sau đó, tôi không tin rằng chỉ số hàng phải là một chức năng của khung nhìn.
Đối với bảng dữ liệu lồng nhau, bạn nên tắt chỉ mục hàng từ bean hàng. Nó cung cấp cho bạn nhiều quyền kiểm soát hơn nếu bạn quyết định thực hiện những việc như phân trang trên các tập dữ liệu.
Xem [http: // stackoverflow.com/questions/14633008/jsf-2-datatable-row-index-không-datamodel]. Câu trả lời này mới hơn những câu hỏi dưới đây - cũng ngắn và ngọt ngào. – fr13d