Syntaxe de liaison sans conteneur KnockoutJS
Veuillez patienter une seconde: KnockoutJS offre une option ultra-pratique d'utilisation d'une syntaxe de liaison sans conteneur pour sa foreach
liaison, comme indiqué dans la note 4 duforeach
documentation de liaison.
http://knockoutjs.com/documentation/foreach-binding.html
Comme l'illustre l'exemple de documentation de Knockout, vous pouvez écrire votre liaison dans KnockoutJS comme ceci:
<ul>
<li class="header">Header item</li>
<!-- ko foreach: myItems -->
<li>Item <span data-bind="text: $data"></span></li>
<!-- /ko -->
</ul>
Je pense que c'est plutôt dommage qu'AngularJS n'offre pas ce type de syntaxe.
Angulaire ng-repeat-start
etng-repeat-end
Dans la manière AngularJS de résoudre des ng-repeat
problèmes, les exemples que je rencontre sont du type jmagnusson posté dans sa réponse (utile).
<li ng-repeat-start="page in [1,2,3,4,5]"><a href="#">{{page}}</a></li>
<li ng-repeat-end></li>
Ma pensée originale en voyant cette syntaxe est: vraiment? Pourquoi Angular force-t-il tout ce balisage supplémentaire avec lequel je ne veux rien avoir à faire et qui est tellement plus facile dans Knockout? Mais ensuite, le commentaire de hitautodestruct dans la réponse de jmagnusson a commencé à me faire me demander: qu'est-ce qui est généré avec ng-repeat-start et ng-repeat-end sur des balises séparées?
Une façon plus propre d'utiliser ng-repeat-start
etng-repeat-end
Après enquête sur l'assertion de hitautodestruct, ajouter ng-repeat-end
une balise séparée est exactement ce que je ne voudrais pas faire dans la plupart des cas, car cela génère des éléments totalement inutiles: dans ce cas,<li>
éléments sans rien. La liste paginée de Bootstrap 3 met en forme les éléments de la liste afin qu'il semble que vous n'ayez pas généré d'éléments superflus, mais lorsque vous inspectez le code HTML généré, ils sont là.
Heureusement , vous n'avez pas besoin de faire grand-chose pour avoir une solution plus propre et une quantité plus courte de HTML: il suffit de mettre la ng-repeat-end
déclaration sur la même balise html qui a l'extensionng-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>
Cela donne 3 avantages:
- moins de balises html à écrire
- inutiles, les balises vides ne sont pas générées par Angular
- lorsque le tableau à répéter est vide, la balise avec
ng-repeat
ne sera pas générée, ce qui vous donne le même avantage que la liaison sans conteneur de Knockout vous donne à cet égard
Mais il y a encore un moyen plus propre
Après avoir examiné plus en détail les commentaires dans github sur ce problème pour Angular, https://github.com/angular/angular.js/issues/1891 ,
vous n'avez pas besoin d'utiliser ng-repeat-start
et ng-repeat-end
d'obtenir les mêmes avantages. Au lieu de cela, en reprenant l'exemple de jmagnusson, nous pouvons simplement aller:
<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>
Alors, quand utiliser ng-repeat-start
et ng-repeat-end
? Selon la documentation angulaire , pour
... répéter une série d'éléments au lieu d'un seul élément parent ...
Assez parlé, montrez quelques exemples!
C'est suffisant; ce jsbin parcourt cinq exemples de ce qui se passe lorsque vous faites et lorsque vous n'utilisez pas ng-repeat-end
sur la même balise.