Istniejące rozwiązanie nie wydaje mi się takie złe. Argument rowIndex powinien działać w tabelach zagnieżdżonych, o ile odwołujesz się do modelu tabeli zagnieżdżonej. Model
<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>
Próbka:
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();
}
}
zagnieżdżanie DataTables powinny być ogólnie unikać - jeśli nie jesteś ostrożny (np ich dzieci w formie), może to prowadzić do O (n^2) przekazywać dzieciom w tabeli dla każdej fazy cyklu życia na przesłanym (i jest 6 faz w cyklu życia).
czegoś, co jest na zewnątrz modelu, można użyć prostego licznika w zarządzanym fasoli:
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>
Widok:
<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>
Działa to, ponieważ fasola i s zakres żądania i związany z formantem tylko do odczytu poza formularzem. Nie działałoby to w zagnieżdżonej tabeli danych, chyba że chcesz, aby licznik wierszy był globalny dla widoku. Ale nie jestem przekonany, że indeks wiersza powinien być funkcją widoku.
W przypadku zagnieżdżonej tabeli danych lepiej byłoby podać indeks wiersza z komponentu bean wiersza. Zapewnia to większą kontrolę, jeśli zdecydujesz się również na podział stron na zestawy danych.
Zobacz [http: // stackoverflow.com/questions/14633008/jsf-2-datatable-row-index-without-datamodel]. Ta odpowiedź jest nowsza niż te poniżej - również krótkie i słodkie. – fr13d