2009-12-30 6 views
8

Ich habe HTML-Tabelle in JSF-Webanwendung. Ich erzeuge Zeilen dynamisch mit <ui:repeat>. Ich möchte einen Zähler für jede Zeile. Wie kann ich das bekommen? Irgendeine Hilfe?Zeilenzähler für HTML-Tabellenzeile

Ähnlich wie rowKeyVar in Rich-Faces-dataTable.

Antwort

11

Da Sie Richfaces verwenden, können Sie es mit seiner Iteration Tag tun (<a4j:repeat>), die ein bisschen besser geeignet ist als <c:forEach> verwenden, und das ist wie eine Erweiterung zu <ui:repeat>

<table> 
    <a4j:repeat value="#{bean.list}" var="item" rowKeyVar="idx"> 
     <tr> 
      <td><h:outputText value="#{idx + 1}" /></td> 
      <td><h:outputText value="#{item.someProperty}" /></td> 
      <td><h:outputText value="#{item.otherProperty}" /></td> 
     </tr> 
    </a4j:repeat> 
</table> 
6

Sie können es nicht schön mit der ui:repeat tun, aber Sie können dies mit der h:dataTable tun. Binden Sie die Komponente an eine UIData-Eigenschaft in der Backing-Bean. Es hat eine getRowIndex() Methode, die genau das tut, was Sie brauchen:

<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> 

Hier bin ich das Hinzufügen 1-UIData#getRowIndex(), weil es null basiert. Sie können den Using datatables Artikel nützlich finden, um mehr über Datenquellen zu erfahren.

Wenn Sie tatsächlich ein bisschen mehr Kontrolle über die Tabellen-Layout (insbesondere unter Verwendung von colspans/über mehr Zeilen, die in dem realen JSF h:dataTable Tag fehlen) mögen, dann ist eine Alternative, den JSTL c:forEach Tag zu verwenden, die ein varStatus Attribut hat die gibt Ihnen einen Griff zum Schleifenstatus.

<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> 
+0

Ich werde den zweiten Ansatz versuchen. c: forEach. Danke BalusC – crazyTechie

+2

Der Hauptnachteil von 'c: forEach' ist, dass Sie Input-Komponenten in der Tabelle nicht einfach verwenden können. Mit einer 'h: dataTable' können Sie einfach eine editierbare Datentabelle erstellen und JSF verwaltet alle Daten, die vollständig gesammelt und aktualisiert werden. – BalusC

0

Es gibt keinen Zähler für jede Zeile in ui: wiederholen. Wie BalusC sagte, können Sie für h: Datatable gehen. Eine andere Idee ist indirekt, dass Sie eine zusätzliche Indexmethode in Bean für jedes Objekt in der Liste auf der Serverseite hinzufügen können und diese in jsf holen und manipulieren können.

19

Ab Facelets 2.0, dies ist jetzt möglich mit der varStatus.

<ui:repeat varStatus="status" var="user" value="#{collection}"> 
    #{status.index} 
</ui:repeat> 
0

Eine schlechte (oder gute Idee) wird mit JavaScript diesen Trick zu tun.

<script> 
    var numberOfIndex = 0; 
</script> 
<ui:repeat value="#{modelBean.listUser}" var="item"> 
    <tr> 
      <td><script>numberOfIndex -=-1;document.write(numberOfIndex);</script></td> 
     <td>${item.id}</td> 
     <td>${item.name}</td> 
    </tr> 
</ui:repeat>