¿Hay alguna forma de ng-repeat
un número definido de veces en lugar de tener que iterar sobre una matriz?
Por ejemplo, a continuación quiero que el elemento de la lista se muestre 5 veces, suponiendo que sea $scope.number
igual a 5, además de incrementar el número para que cada elemento de la lista se incremente como 1, 2, 3, 4, 5
Resultado deseado:
<ul>
<li><span>1</span></li>
<li><span>2</span></li>
<li><span>3</span></li>
<li><span>4</span></li>
<li><span>5</span></li>
</ul>
javascript
html
angularjs
angularjs-ng-repeat
Malcr001
fuente
fuente
Respuestas:
Actualización (25/09/2018)
Las versiones más recientes de AngularJS (> = 1.3.0) le permiten hacer esto solo con una variable (no se necesita ninguna función):
Esto no era posible en el momento en que se hizo la pregunta por primera vez. Gracias a @Nikhil Nambiar por su respuesta a continuación para esta actualización
Original (29/05/2013)
Por el momento,
ng-repeat
solo acepta una colección como parámetro, pero puede hacer esto:Y en algún lugar de tu controlador:
Esto le permitirá cambiar
$scope.number
a cualquier número que desee y aún así mantener el enlace que está buscando.EDITAR (1/6/2014) - Las versiones más nuevas de AngularJS (> = 1.1.5) requieren
track by $index
:Aquí hay un violín con un par de listas que usan la misma
getNumber
función.fuente
Puedes hacerlo:
fuente
Aquí hay un ejemplo de cómo podría hacer esto. Tenga en cuenta que me inspiró un comentario en los documentos ng-repeat: http://jsfiddle.net/digitalzebra/wnWY6/
Tenga en cuenta la directiva ng-repeat:
Aquí está el controlador:
fuente
_.range
subrayado o lodash para crear la matriz: $ scope.range = _.range (0, n);Creo que este jsFiddle de este hilo podría ser lo que estás buscando.
fuente
$scope.number
igual a 5". La intención era usar una variable entera para definir el recuento de elementos, no codificarlo y no usar una matriz predefinida.$scope.limit = 2
) y usarlo como...|limitTo:limit
- ver violín actualizadoUn enfoque más simple sería (por ejemplo, 5 veces):
fuente
Array(5)
(o de hecho[...Array(5).keys()]
para obtener una matriz [0,1,2,3,4])Me encontré con el mismo problema. Encontré este hilo, pero no me gustaron los métodos que tenían aquí. Mi solución estaba usando underscore.js, que ya habíamos instalado. Es tan simple como esto:
Esto hará exactamente lo que estás buscando.
fuente
$scope._ = _
.$rootScope
para que pueda usarse en todas partes. Ponga esto en suapp.run
función justo después deapp.config
:app.run(function ($rootScope) { $rootScope._ = _; });
Quería mantener mi html muy mínimo, así que definí un pequeño filtro que crea la matriz [0,1,2, ...] como lo han hecho otros:
Después de eso, en la vista es posible usar así:
fuente
Esto es realmente feo, pero funciona sin un controlador para un entero o una variable:
entero:
variable:
fuente
_ in (_ = []).length = 33; _ track by $index
un poco más pequeñoHay muchas maneras de hacer esto. Estaba realmente molesto por tener la lógica en mi controlador, así que creé una directiva simple para resolver el problema de repetir un elemento n veces.
Instalación:
La directiva se puede instalar usando
bower install angular-repeat-n
Ejemplo:
produce:
1234
También funciona usando una variable de alcance:
Fuente:
Github
fuente
Esta es solo una ligera variación en la respuesta aceptada, pero realmente no necesita crear una nueva función. Solo para importar 'Array' en el alcance:
Vea este violín para un ejemplo en vivo.
fuente
Respuesta más fácil: 2 líneas de código
JS (en su controlador AngularJS)
HTML
... donde
repeatCount
está el número de repeticiones que deberían aparecer en esta ubicación.fuente
repeatCount
con un número real en el HTML, y siempre que ese número sea menor o igual aMAX_REPEATS
, esto le permitirá establecer el número de repeticiones en el HTML.ngRepeat
directiva. El uso deArray.prototype.slice
JS idiomático siempre se debe elegir sobre una biblioteca como underscore.js (dependiendo de la compatibilidad del navegador).angular proporciona una función muy dulce llamada corte ... con esto puedes lograr lo que estás buscando. por ejemplo, ng-repeat = "ab en abc.slice (startIndex, endIndex)"
esta demostración: http://jsfiddle.net/sahilosheal/LurcV/39/ lo ayudará y le dirá cómo usar esta función de "facilitar la vida". :)
html:
CSS:
ng-JS:
fuente
Heres una respuesta para angular 1.2.x
Básicamente es lo mismo, con la ligera modificación de
ng-repeat
Aquí está el violín: http://jsfiddle.net/cHQLH/153/
Esto se debe a que angular 1.2 no permite valores duplicados en la directiva. Esto significa que si está intentando hacer lo siguiente, recibirá un error.
fuente
Puedes usar la
ng-if
directiva conng-repeat
Entonces, si num es el número de veces que necesita repetir el elemento:
fuente
ng-repeat
de esta manera aún generará sus etiquetas comentadas (<!-- ngIf: $index < num -->
etc.). Simplemente no habráli
elementos para que el DOM los represente. Marque una "fuente de vista" en el panel de resultados aquí para ver a qué me refiero.Puedes usar este ejemplo.
Controlador interno:
Ejemplo para seleccionar elemento en el lado del código HTML:
fuente
Para los usuarios que usan CoffeeScript, puede usar una comprensión de rango:
Directiva
o controlador
Modelo
fuente
Ampliando un poco la primera respuesta de Ivan, puede usar una cadena como la colección sin una pista por enunciado siempre que los caracteres sean únicos, por lo que si el caso de uso es menor a 10 números, esa es la pregunta que simplemente haría :
Lo cual es un poco jenky, claro, pero lo suficientemente simple para mirar y no particularmente confuso.
fuente
Primero, cree un filtro angular usando LoDash:
La función de tiempos de LoDash es capaz de manejar nulos, indefinidos, 0, números y cadenas de representación de números.
Luego, úsalo en tu HTML como esto:
o
fuente
Necesitaba una solución más dinámica para esto, donde podría incrementar la repetición.
HTML
Control de duplicador
JS
fuente
Angular proporciona filtros para modificar una colección. En este caso, la colección sería nula, es decir, [], y el filtro también toma argumentos, como sigue:
JS:
Este método es muy similar a los propuestos anteriormente y no es necesariamente superior, pero muestra el poder de los filtros en AngularJS.
fuente
Si n no es demasiado alto, otra opción podría ser dividir ('') con una cadena de n caracteres:
fuente
Encontré el mismo problema y esto es con lo que salí:
... y el html:
EJEMPLO EN VIVO
Usé la
times
función de subrayado ya que ya la estábamos usando en el proyecto, pero puede reemplazarla fácilmente con código nativo.fuente
Estoy creando una directiva reutilizable donde el número máximo vendrá de otra ng-repeat. Entonces, esta es una edición sobre la respuesta mejor votada.
Simplemente cambie el código en el controlador a esto:
Esto devolverá una nueva matriz con un número especificado de iteraciones
fuente
dado que iterar sobre una cadena representará un elemento para cada carácter:
Podemos usar esta solución fea pero sin código usando el
number|n decimal places
filtro nativo.de esta manera tendremos
mynumber
elementos sin código extra. Decir'0.000'
.Usamos
mynumber - 2
para compensar0.
No funcionará para números inferiores a 3, pero podría ser útil en algunos casos.
fuente
track by $index
?ng-repeat="i in [1,2,3,4]"
$scope.number
aaaa
fue un ejemplo para explicar mi solución no muy elegante. Usando 'aaaa' o 'abcd' codificados, obtienes una lista de longitud fija, pero agregandomynumber-2
decimales a 0, obtienes una 'cadena' conmynumber
caracteres. Digamosmynumber=5
, lo entiendes'0.000'
, luego iteramos usando $ indexfuente
manera simple:
en el componente / controlador y luego:
Este código es de mi proyecto de mecanografía, pero podría reorganizarse a JavaScript puro
fuente