Actualmente estoy usando este código para generar una lista:
<ul ng-cloak>
<div ng-repeat="n in list">
<li><a href="{{ n[1] }}">{{ n[0] }}</a></li>
<li class="divider"></i>
</div>
<li>Additional item</li>
</ul>
Sin embargo, el <div>
elemento está causando algunos defectos de representación muy menores en algunos navegadores. Me gustaría saber si hay alguna manera de hacer ng-repeat sin el contenedor div, o algún método alternativo para lograr el mismo efecto.
javascript
css
html
angularjs
nehz
fuente
fuente
htmlAppend
directiva?Respuestas:
Como dijo Andy Joslin, estaban trabajando en repeticiones de ng basadas en comentarios, pero aparentemente había demasiados problemas con el navegador . Afortunadamente, AngularJS 1.2 agrega soporte integrado para repetir sin agregar elementos secundarios con las nuevas directivas
ng-repeat-start
yng-repeat-end
.Aquí hay un pequeño ejemplo para agregar paginación Bootstrap :
Puede encontrar un ejemplo completo de trabajo aquí .
John Lindquist también tiene un video tutorial sobre esto en su excelente página egghead.io .
fuente
ng-repeat-start/end
pero este es un ejemplo confuso y el caso de uso incorrecto para él.ng-repeat
Aquí se debe utilizar un estándar , ya que su código genera un vacío adicionalli
para cada elemento. Probablemente deberías mencionar eso en tu publicación.ng-repeat-start
. Agregaré ladivider
clase html a mi respuesta para ser más claro.ng-repeat-start
yng-repeat-end
son un poco confusos. La documentación de Angular ayuda: https://docs.angularjs.org/api/ng/directive/ngRepeat#special-repeat-start-and-end-pointsSintaxis 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 laforeach
documentación de enlace. http://knockoutjs.com/documentation/foreach-binding.htmlComo ilustra el ejemplo de la documentación de Knockout, puede escribir su enlace en KnockoutJS de esta manera:
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.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
.Esto da 3 ventajas:
ng-repeat
no se generará, lo que le brinda la misma ventaja que el enlace sin contenedor de Knockout le brinda en este sentidoPero 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
yng-repeat-end
lograr las mismas ventajas. En cambio, bifurcando nuevamente el ejemplo de jmagnusson, podemos simplemente ir:Entonces, ¿cuándo usar
ng-repeat-start
yng-repeat-end
? Según la documentación angular , para¡Basta de hablar, muestra algunos ejemplos!
Lo suficientemente justo; este jsbin muestra cinco ejemplos de lo que sucede cuando lo haces y cuando no usas
ng-repeat-end
en la misma etiqueta.http://jsbin.com/eXaPibI/1/
fuente
ng-repeat-start
yng-repeat-end
al mismo elemento es completamente inútil cuando puede usar el valor predeterminado de angularng-repeat
y terminar con él.ng-repeat
o encuentre una alternativa al uso de OPng-repeat
que elimine eldiv
artefacto en el HTML. Su respuesta no hace esto, ya que no hay forma de usarla para los dosli
elementos de la pregunta. Si me equivoco aquí, proporcione un marcado de muestra que adapte el código de OP para eliminar eldiv
elemento.li
que se genere un elemento divisor , que es el extrali
que ve en su jsbin.ngRepeat puede no ser suficiente, sin embargo, puede combinarlo con una directiva personalizada. Puede delegar la tarea de agregar elementos divisores al código si no le importa un poco de jQuery.
Una directiva tan simple no necesita realmente un valor de atributo, pero podría brindarle muchas posibilidades, como agregar condicionalmente un divisor de acuerdo con el índice, la longitud, etc. o algo completamente diferente.
fuente
Recientemente tuve el mismo problema porque tuve que repetir una colección arbitraria de intervalos e imágenes; tener un elemento alrededor de ellos no era una opción; sin embargo, hay una solución simple, cree una directiva "nula":
Luego puede usar una repetición en ese elemento, donde element.url apunta a la plantilla para ese elemento:
Esto repetirá cualquier cantidad de plantillas diferentes sin ningún contenedor alrededor.
Nota: hmm, podría haber jurado a ciegas que esto eliminó el elemento di-null al renderizar, pero al verificarlo nuevamente, no lo hace ... aunque resolvió mis problemas de diseño ... más y más curioso ...
fuente
replace
está en desuso desde 2.0.Hay una restricción de directiva de comentarios, pero ngRepeat no la admite (ya que necesita un elemento para repetir).
Creo que vi al equipo angular decir que trabajarían en las repeticiones de comentarios, pero no estoy seguro. Debería abrir un problema en el repositorio. http://github.com/angular/angular.js
fuente
No hay una forma mágica angular de hacer esto, en su caso puede hacer esto, para obtener HTML válido, si está utilizando Bootstrap. Entonces obtendrá el mismo efecto que agregar el divisor li.
Crear una clase:
Ahora cambie su código a esto:
fuente
para una solución que realmente funcione
html
agregar una directiva angular.js
para una breve explicación,
ng-repeat se une a la
<remove>
elemento y se como debería, y debido a que hemos usado ng-repeat-start / ng-repeat-end, repite un bloque de html, no solo un elemento.luego, la directiva de eliminación personalizada coloca los
<remove>
elementos de inicio y finalización con<!--removed element-->
fuente
replaceWith(...)
resultados de prueba en un nodo de texto, no en un comentario. He descubierto que solo usaelement.remove()
obras.