Sintassi dell'associazione senza contenitore KnockoutJS
Per favore, abbi pazienza un secondo: KnockoutJS offre un'opzione ultra conveniente di utilizzare una sintassi di binding senza contenitore per il suo foreachbinding, come discusso nella Nota 4 delforeach documentazione di binding.
http://knockoutjs.com/documentation/foreach-binding.html
Come illustra l'esempio della documentazione di Knockout, puoi scrivere il tuo binding in KnockoutJS in questo modo:
<ul>
<li class="header">Header item</li>
<!-- ko foreach: myItems -->
<li>Item <span data-bind="text: $data"></span></li>
<!-- /ko -->
</ul>
Penso che sia piuttosto sfortunato AngularJS non offre questo tipo di sintassi.
Angular ng-repeat-starteng-repeat-end
Nel modo in cui AngularJS risolve i ng-repeatproblemi, i campioni che trovo sono del tipo jmagnusson pubblicato nella sua (utile) risposta.
<li ng-repeat-start="page in [1,2,3,4,5]"><a href="#">{{page}}</a></li>
<li ng-repeat-end></li>
Il mio pensiero originale dopo aver visto questa sintassi è: davvero? Perché Angular sta forzando tutto questo markup extra con cui non voglio avere niente a che fare e che è molto più facile in Knockout? Ma poi il commento di hitautodestruct nella risposta di jmagnusson ha iniziato a farmi chiedere: cosa viene generato con ng-repeat-start e ng-repeat-end su tag separati?
Un modo più pulito di usare ng-repeat-starteng-repeat-end
Dopo aver esaminato l'affermazione di hitautodestruct, l'aggiunta ng-repeat-enddi un tag separato è esattamente ciò che non vorrei fare nella maggior parte dei casi, perché genera elementi completamente privi di utilizzo: in questo caso,<li> elementi senza nulla in essi. L'elenco impaginato di Bootstrap 3 modella gli elementi dell'elenco in modo che sembri non aver generato alcun elemento superfluo, ma quando si ispeziona l'html generato, sono lì.
Fortunatamente , non è necessario fare molto per avere una soluzione più pulita e una quantità minore di html: basta mettere la ng-repeat-enddichiarazione sullo stesso tag html che ha l'estensioneng-repeat-start .
<ul class="pagination">
<li>
<a href="#">«</a>
</li>
<li ng-repeat-start="page in [1,2,3,4,5]" ng-repeat-end><a href="#"></a></li>
<li>
<a href="#">»</a>
</li>
</ul>
Questo offre 3 vantaggi:
- meno tag html da scrivere
- tag inutili e vuoti non vengono generati da Angular
- quando l'array da ripetere è vuoto, il tag con
ng-repeatnon verrà generato, dandoti lo stesso vantaggio che l'associazione senza contenitore di Knockout ti offre a questo proposito
Ma c'è ancora un modo più pulito
Dopo aver esaminato ulteriormente i commenti in github su questo problema per Angular, https://github.com/angular/angular.js/issues/1891 ,
non è necessario utilizzare ng-repeat-starte ng-repeat-endper ottenere gli stessi vantaggi. Invece, biforcando di nuovo l'esempio di jmagnusson, possiamo semplicemente andare:
<ul class="pagination">
<li>
<a href="#">«</a>
</li>
<li ng-repeat="page in [1,2,3,4,5,6]"><a href="#">{{page}}</a></li>
<li>
<a href="#">»</a>
</li>
</ul>
Quindi quando usare ng-repeat-starte ng-repeat-end? Come da documentazione angolare , a
... ripeti una serie di elementi invece di un solo elemento genitore ...
Basta parlare, mostra alcuni esempi!
Giusto; questo jsbin illustra cinque esempi di cosa succede quando lo fai e quando non lo using-repeat-end sullo stesso tag.