Sintaxis de enlace sin contenedor KnockoutJS
Por favor, tengan paciencia conmigo un segundo: KnockoutJS ofrece una opción muy conveniente de usar una sintaxis de enlace sin contenedor para su foreach
enlace, como se explica en la Nota 4 de la foreach
documentación de enlace.
http://knockoutjs.com/documentation/foreach-binding.html
Como ilustra el ejemplo de la documentación de Knockout, puede escribir su enlace en KnockoutJS de esta manera:
<ul>
<li class="header">Header item</li>
<!-- ko foreach: myItems -->
<li>Item <span data-bind="text: $data"></span></li>
<!-- /ko -->
</ul>
Creo que es bastante lamentable que AngularJS no ofrezca este tipo de sintaxis.
Angular ng-repeat-start
yng-repeat-end
En la forma en que AngularJS resuelve ng-repeat
problemas, las muestras que encuentro son del tipo que jmagnusson publicó en su (útil) respuesta.
<li ng-repeat-start="page in [1,2,3,4,5]"><a href="#">{{page}}</a></li>
<li ng-repeat-end></li>
Mi pensamiento original al ver esta sintaxis es: ¿en serio? ¿Por qué Angular está forzando todo este marcado adicional con el que no quiero tener nada que ver y que es mucho más fácil en Knockout? Pero luego el comentario de hitautodestruct en la respuesta de jmagnusson comenzó a hacerme preguntarme: ¿qué se está generando con ng-repeat-start y ng-repeat-end en etiquetas separadas?
Una forma más limpia de usar ng-repeat-start
yng-repeat-end
Tras la investigación de la afirmación de hitautodestruct, agregar ng-repeat-end
una etiqueta separada es exactamente lo que no quisiera hacer en la mayoría de los casos, porque genera elementos completamente inútiles: en este caso, <li>
elementos sin nada en ellos. La lista paginada de Bootstrap 3 diseña los elementos de la lista para que parezca que no generó ningún elemento superfluo, pero cuando inspecciona el html generado, están allí.
Afortunadamente , no necesita hacer mucho para tener una solución más limpia y una menor cantidad de html: simplemente coloque la ng-repeat-end
declaración en la misma etiqueta html que tiene la extensiónng-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>
Esto da 3 ventajas:
- menos etiquetas html para escribir
- Angular no genera etiquetas vacías e inútiles
- cuando la matriz para repetir está vacía, la etiqueta con
ng-repeat
no se generará, lo que le brinda la misma ventaja que el enlace sin contenedor de Knockout le brinda en este sentido
Pero todavía hay una forma más limpia
Después de revisar más los comentarios en github sobre este tema para Angular, https://github.com/angular/angular.js/issues/1891 ,
no es necesario usar ng-repeat-start
y ng-repeat-end
lograr las mismas ventajas. En cambio, bifurcando nuevamente el ejemplo de jmagnusson, podemos simplemente 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>
Entonces, ¿cuándo usar ng-repeat-start
y ng-repeat-end
? Según la documentación angular , para
... repite una serie de elementos en lugar de solo un elemento padre ...
¡Basta de hablar, muestra algunos ejemplos!
Lo suficientemente justo; este jsbin muestra cinco ejemplos de lo que sucede cuando lo haces y cuando no usasng-repeat-end
en la misma etiqueta.