Bạn không thể làm điều đó một cách độc đáo với ui:repeat
, nhưng bạn có thể làm như vậy với h:dataTable
. Liên kết thành phần với thuộc tính UIData
trong bean sao lưu. Nó có một phương pháp getRowIndex()
mà thực hiện chính xác những gì bạn cần:
<h:dataTable binding="#{bean.table}" value="#{bean.list}" var="item">
<h:column><h:outputText value="#{bean.table.rowIndex + 1}" /></h:column>
<h:column><h:outputText value="#{item.someProperty}" /></h:column>
<h:column><h:outputText value="#{item.otherProperty}" /></h:column>
</h:dataTable>
Ở đây tôi thêm 1
-UIData#getRowIndex()
vì nó là zero-based. Bạn có thể tìm thấy bài viết Using datatables hữu ích để tìm hiểu thêm về datatables.
Nếu bạn thực sự muốn kiểm soát nhiều hơn một chút so với cách bố trí bảng (đặc biệt là sử dụng colspans/rowspans, mà đang thiếu trong thực thẻ JSF h:dataTable
), sau đó một sự thay thế là sử dụng JSTL c:forEach
thẻ trong đó có một thuộc tính varStatus
mà cho phép bạn xử lý trạng thái vòng lặp.
<table>
<c:forEach items="#{bean.list}" var="item" varStatus="loop">
<tr>
<td><h:outputText value="#{loop.index + 1}" /></td>
<td><h:outputText value="#{item.someProperty}" /></td>
<td><h:outputText value="#{item.otherProperty}" /></td>
</tr>
</c:forEach>
</table>
Tôi sẽ thử phương pháp thứ hai. c: forEach. Cảm ơn BalusC – crazyTechie
Những bất lợi lớn của 'c: forEach' là bạn không thể sử dụng các thành phần đầu vào trong bảng một cách dễ dàng. Với một 'h: dataTable' bạn có thể dễ dàng tạo ra một datatable có thể chỉnh sửa và JSF sẽ quản lý tất cả các dữ liệu thu thập và cập nhật đầy đủ chính nó. – BalusC