Angular.js ng-repeat su più tr


125

Sto usando Angular.js per un'applicazione che utilizza trs nascosti per simulare un effetto scorrevole mostrando il tr e facendo scorrere il div nel td sottostante. Questo processo ha funzionato in modo fantastico usando knockout.js durante l'iterazione su una matrice di queste righe, perché potevo usare <!-- ko:foreach -->entrambi gli elementi tr.

Con angolare, ng-repeatdeve essere applicato a un elemento html, il che significa che non riesco a ripetere queste doppie righe usando metodi standard. La mia prima risposta a questo è stata quella di creare una direttiva per rappresentare queste doppie trs, ma questo è risultato breve perché i modelli di direttiva devono avere un singolo elemento root, ma ne ho due ( <tr></tr><tr></tr>).

Se qualcuno con esperienza con ng-repeat e angolare che ha risolto questo problema può spiegare come risolvere questo problema, sarei molto grato.

(Dovrei anche notare che il collegamento ng-repeatal tbody è un'opzione, ma questo produce più tbodys e presumo che sia una forma errata per HTML standard, anche se correggimi se sbaglio)

Risposte:


169

L'uso di ng-repeaton tbodysembra essere valido vedi questo post .

Anche un rapido test attraverso un validatore HTML ha permesso più tbodyelementi nella stessa tabella.

Aggiornamento: almeno da Angular 1.2 esiste un ng-repeat-starte ng-repeat-endper consentire di ripetere una serie di elementi. Consulta la documentazione per ulteriori informazioni e grazie a @Onite per il commento!


Fantastico. Ho avuto lo stesso problema e in effetti ho discusso di questo, ma ho pensato che non avrebbe mai funzionato solo iterando sul tag tbody. Grazie!
KhalilRavanna,

12
Ora è un po 'dopo il fatto, ma Angular 1.2 ha introdotto le direttive ng-repeat-start e ng-repeat-end per consentire di iterare su più elementi.
Onite,

1
@Onite È molto più tardi ora e sto usando AS 1.5 ma non sapevo delle funzionalità aggiunte -end e -start di ng-repeat. Mi hai indicato lì, quindi non scusarti mai per aver aggiunto informazioni a una risposta.
Neville,

1
L'URL per la ripetizione della documentazione è errato ma la modifica non è più di sei caratteri, quindi non posso modificarla senza solo aggiungere qualche meta modifica inutile .. L'URL corretto dovrebbe essere docs.angularjs.org/api/ng/ direttiva / nGRipetere
Bill Rawlinson il

35

Lo sviluppatore di AngularJS @ igor-minar ha risposto a questo in Angular.js ng-repeat su più elementi .

Miško Hevery ha recentemente implementato il supporto adeguato tramite ng-repeat-starte ng-repeat-end. Questo miglioramento non è stato rilasciato a partire da 1.0.7 (stabile) e 1.1.5 (instabile).

Aggiornare

Questo è ora disponibile in 1.2.0rc1. Consulta i documenti ufficiali e questo screencast di John Lindquist.


Lo menziona nel livestream del Meetup Angular dell'11 giugno 2013. In attesa di questa e di altre funzionalità di Angular 1.1.5+ e Angular 2.0.
thegreenpizza,

Sto indicando la 1.1.5 su cdnjs cdn e questo non funziona. //cdnjs.cloudflare.com/ajax/libs/angular.js/1.1.5/angular.min.js sai in quale versione dovrebbe essere disponibile?
Shanimal,

Corretto, non è stato rilasciato dalla 1.1.5, quindi guarda 1.1.6 (o molto probabilmente 1.2.0) per atterrare presto. Ecco l'impegno di Miško per il rilascio: github.com/angular/angular.js/commit/…
Anson,

Va anche notato che questo funziona per ogni direttiva, non solo ngRepeat;)
7hi4g0

4

Avere più elementi potrebbe essere valido ma se stai cercando di creare una griglia scorrevole con intestazione / piè di pagina fissi, il seguito potrebbe non funzionare. Questo codice presuppone i seguenti CSS, jquery e AngularJS.

HTML

<table id="tablegrid_ko">
        <thead>
            <tr>
                <th>
                   Product Title
                </th>
                <th>
                </th>
            </tr>
        </thead>

        <tbody ng-repeat="item in itemList">
            <tr ng-repeat="itemUnit in item.itemUnit">
                <td>{{itemUnit.Name}}</td>
            </tr>
        </tbody>
</table>

CSS per creare intestazione / piè di pagina fissi per la griglia della tabella scorrevole

#tablegrid_ko {
    max-height: 450px;    
}
#tablegrid_ko
{
border-width: 0 0 1px 1px;
border-spacing: 0;
border-collapse: collapse;
border-style: solid;
}

#tablegrid_ko td, #tablegrid_ko th
{
margin: 0;
padding: 4px;
border-width: 1px 1px 0 0;
border-style: solid;
}


#tablegrid_ko{border-collapse:separate}
#tablegrid_ko tfoot,#tablegrid_ko thead{z-index:1}
#tablegrid_ko tbody{z-index:0}
#tablegrid_ko tr{height:20px}
#tablegrid_ko tr >td,#tablegrid_ko tr >th{
border-width:1px;border-style:outset;height:20px;
max-height:20px;xwidth:45px;xmin-width:45px;xmax-width:45px;white-space:nowrap;overflow:hidden;padding:3px}

#tablegrid_ko tr >th{
background-color:#999;border-color:#2c85b1 #18475f #18475f #2c85b1;color:#fff;font-weight:bold}
#tablegrid_ko tr >td{background-color:#fff}
#tablegrid_ko tr:nth-child(odd)>td{background-color:#f3f3f3;border-color:#fff #e6e6e6 #e6e6e6 #fff}
#tablegrid_ko tr:nth-child(even)>td{background-color:#ddd;border-color:#eaeaea #d0d0d0 #d0d0d0 #eaeaea}

div.scrollable-table-wrapper{
background:#268;border:1px solid #268;
display:inline-block;height:285px;min-height:285px;
max-height:285px;width:550px;position:relative;overflow:hidden;padding:26px 0}

div.scrollable-table-wrapper table{position:static}
div.scrollable-table-wrapper tfoot,div.scrollable-table-wrapper thead{position:absolute}
div.scrollable-table-wrapper thead{left:0;top:0}
div.scrollable-table-wrapper tfoot{left:0;bottom:0}
div.scrollable-table-wrapper tbody{display:block;position:relative;overflow-y:scroll;height:283px;width:550px}

Jquery per legare lo scorrimento orizzontale del corpo, questo non funziona perché il corpo si ripete durante la ripetizione del movimento.

$(function ($) {

$.fn.tablegrid = function () {


        var $table = $(this);
        var $thead = $table.find('thead');
        var $tbody = $table.find('tbody');
        var $tfoot = $table.find('tfoot');

        $table.wrap("<div class='scrollable-table-wrapper'></div>");

        $tbody.bind('scroll', function (ev) {
            var $css = { 'left': -ev.target.scrollLeft };
            $thead.css($css);
            //$tfoot.css($css);
        });


    }; // plugin function



}(jQuery));

0

Puoi farlo in questo modo, come ho mostrato in questa risposta: https://stackoverflow.com/a/26420732/769900

<tr ng-repeat="m in myData">
   <td>{{m.Name}}</td>
   <td>{{m.LastName}}</td>

   <td ng-if="$first" rowspan="{{myData.length}}">
       <ul>
           <li ng-repeat="d in days">
               {{d.hours}}
           </li>
       </ul>
   </td> 
</tr>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.