Sintaxe de ligação sem contêiner KnockoutJS
Tenha um segundo: KnockoutJS oferece uma opção extremamente conveniente de usar uma sintaxe de vinculação sem contêiner para sua foreachvinculação, conforme discutido na Nota 4 da foreachdocumentação de vinculação.
http://knockoutjs.com/documentation/foreach-binding.html
Conforme ilustra o exemplo de documentação do Knockout, você pode escrever sua vinculação em KnockoutJS assim:
<ul>
<li class="header">Header item</li>
<!-- ko foreach: myItems -->
<li>Item <span data-bind="text: $data"></span></li>
<!-- /ko -->
</ul>
Eu acho que é lamentável que o AngularJS não ofereça esse tipo de sintaxe.
Angular's ng-repeat-starteng-repeat-end
Na maneira do AngularJS de resolver ng-repeatproblemas, os exemplos que encontrei são do tipo que jmagnusson postou em sua resposta (útil).
<li ng-repeat-start="page in [1,2,3,4,5]"><a href="#">{{page}}</a></li>
<li ng-repeat-end></li>
Meu pensamento original ao ver essa sintaxe é: realmente? Por que o Angular está forçando toda essa marcação extra com a qual não quero fazer nada e que é muito mais fácil no Knockout? Mas então o comentário de hitautodestruct na resposta de jmagnusson começou a me fazer pensar: o que está sendo gerado com ng-repeat-start e ng-repeat-end em tags separadas?
Uma maneira mais limpa de usar ng-repeat-starteng-repeat-end
Ao investigar a afirmação de hitautodestruct, adicionar ng-repeat-enduma tag separada é exatamente o que eu não gostaria de fazer na maioria dos casos, porque gera elementos totalmente inúteis: neste caso, <li>itens sem nada neles. A lista paginada do Bootstrap 3 estiliza os itens da lista para que pareça que você não gerou nenhum item supérfluo, mas quando você inspeciona o html gerado, eles estão lá.
Felizmente , você não precisa fazer muito para ter uma solução mais limpa e uma quantidade menor de html: basta colocar a ng-repeat-enddeclaração na mesma tag html que contém ong-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>
Isso dá 3 vantagens:
- menos tags html para escrever
- inúteis, tags vazias não são geradas pelo Angular
- quando a matriz a ser repetida está vazia, a tag com
ng-repeatnão será gerada, dando a você a mesma vantagem que a vinculação sem recipiente do Knockout oferece a esse respeito
Mas ainda há uma maneira mais limpa
Depois de revisar os comentários no github sobre este problema para Angular, https://github.com/angular/angular.js/issues/1891 ,
você não precisa usar ng-repeat-starte ng-repeat-endobter as mesmas vantagens. Em vez disso, bifurcando novamente o exemplo de jmagnusson, podemos simplesmente ir:
<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>
Então, quando usar ng-repeat-starte ng-repeat-end? De acordo com a documentação angular , para
... repita uma série de elementos em vez de apenas um elemento pai ...
Chega de conversa, mostre alguns exemplos!
Justo; este jsbin percorre cinco exemplos do que acontece quando você faz e quando não usa ng-repeat-endna mesma tag.