Angular proporciona cierto soporte para un ciclo for usando números dentro de sus directivas HTML:
do something
Pero si su variable de ámbito incluye un rango que tiene un número dynamic, tendrá que crear una matriz vacía cada vez.
En el controlador
var range = []; for(var i=0;i<total;i++) { range.push(i); } $scope.range = range;
En el HTML
do something
Esto funciona, pero no es necesario, ya que no utilizaremos la matriz de rango en absoluto dentro del ciclo. ¿Alguien sabe de establecer un rango o un valor regular para el valor mínimo / máximo?
Algo como:
do something
Ajusté esta respuesta un poco y se me ocurrió este violín .
Filtro definido como:
var myApp = angular.module('myApp', []); myApp.filter('range', function() { return function(input, total) { total = parseInt(total); for (var i=0; i
Con la repetición usada así:
do something
Se me ocurrió una versión aún más simple, para crear un rango entre dos números definidos, por ejemplo. 5 a 15
Vea la demostración en JSFiddle
HTML :
- Number {{n}}
Controlador :
$scope.range = function(min, max, step) { step = step || 1; var input = []; for (var i = min; i <= max; i += step) { input.push(i); } return input; };
Nada más que Javascript simple (ni siquiera necesitas un controlador):
{{ $index }}
Muy útil cuando se burla
Se me ocurrió una syntax ligeramente diferente que me queda un poco más y agrega un límite inferior opcional también:
myApp.filter('makeRange', function() { return function(input) { var lowBound, highBound; switch (input.length) { case 1: lowBound = 0; highBound = parseInt(input[0]) - 1; break; case 2: lowBound = parseInt(input[0]); highBound = parseInt(input[1]); break; default: return input; } var result = []; for (var i = lowBound; i <= highBound; i++) result.push(i); return result; }; });
que puedes usar como
Do something 0..9: {{n}}
o
Do something 20..29: {{n}}
Para aquellos nuevos en angularjs. El índice se puede obtener usando $ index.
Por ejemplo:
do something number {{$index}}
Cuando use el filtro práctico de Gloopy, imprima lo siguiente:
hacer algo numero 0
hacer algo numero 1
hacer algo número 2
hacer algo número 3
hacer algo número 4
hacer algo número 5
hacer algo número 6
hacer algo número 7
hacer algo número 8
hacer algo número 9
Una forma breve de hacer esto sería usar el método _.range () de Underscore.js. 🙂
http://underscorejs.org/#range
// declare in your controller or wrap _.range in a function that returns a dynamic range. var range = _.range(1, 11); // val will be each number in the array not the index. {{ $index }}: {{ val }}
Uso mi directiva personalizada ng-repeat-range
:
/** * Ng-Repeat implementation working with number ranges. * * @author Umed Khudoiberdiev */ angular.module('commonsMain').directive('ngRepeatRange', ['$compile', function ($compile) { return { replace: true, scope: { from: '=', to: '=', step: '=' }, link: function (scope, element, attrs) { // returns an array with the range of numbers // you can use _.range instead if you use underscore function range(from, to, step) { var array = []; while (from + step <= to) array[array.length] = from += step; return array; } // prepare range options var from = scope.from || 0; var step = scope.step || 1; var to = scope.to || attrs.ngRepeatRange; // get range of numbers, convert to the string and add ng-repeat var rangeString = range(from, to + 1, step).join(','); angular.element(element).attr('ng-repeat', 'n in [' + rangeString + ']'); angular.element(element).removeAttr('ng-repeat-range'); $compile(element)(scope); } }; }]);
y el código html es
Hello 4 times!
o simplemente
Hello 5 times!
o incluso simplemente
Hello 3 times!
o solo
Hello 7 times!
La solución de código más simple era iniciar una matriz con el rango, y usar el índice $ + por mucho que desee compensarlo:
Puede usar filtros ‘after’ o ‘before’ en el módulo angular.filter ( https://github.com/a8m/angular-filter )
$scope.list = [1,2,3,4,5,6,7,8,9,10]
HTML:
{{ i }}
resultado: 5, 6, 7, 8, 9, 10
El siguiente código define un range()
método range()
disponible para todo el scope de su aplicación MyApp
. Su comportamiento es muy similar al método Python range()
.
angular.module('MyApp').run(['$rootScope', function($rootScope) { $rootScope.range = function(min, max, step) { // parameters validation for method overloading if (max == undefined) { max = min; min = 0; } step = Math.abs(step) || 1; if (min > max) { step = -step; } // building the array var output = []; for (var value=min; value
Con un parámetro:
{{ i }},
0, 1, 2,
Con dos parámetros:
{{ i }},
1, 2, 3, 4,
Con tres parámetros:
{{ i }},
-2, -1.5, -1, -0.5, 0, 0.5,
JS (en su controlador AngularJS)
$scope.range = new Array(MAX_REPEATS); // MAX_REPEATS should be the most repetitions you will ever need in a single ng-repeat
HTML
… donde myCount
es la cantidad de estrellas que deberían aparecer en esta ubicación.
Puede usar $index
para cualquier operación de rastreo. Por ejemplo, si quieres imprimir alguna mutación en el índice, puedes poner lo siguiente en el div
:
{{ ($index + 1) * 0.5 }}
Sin ningún cambio en su controlador, puede usar esto:
ng-repeat="_ in ((_ = []) && (_.length=51) && _) track by $index"
¡Disfrutar!
Usando UnderscoreJS:
angular.module('myModule') .run(['$rootScope', function($rootScope) { $rootScope.range = _.range; }]);
Al aplicar esto a $rootScope
, estará disponible en todas partes:
{{x}}
Muy simple:
$scope.totalPages = new Array(10);
Establecer el scope en el controlador
var range = []; for(var i=20;i<=70;i++) { range.push(i); } $scope.driverAges = range;
Establecer repetición en archivo de plantilla Html
Una mejora a la solución de @ Mormegil
app.filter('makeRange', function() { return function(inp) { var range = [+inp[1] && +inp[0] || 0, +inp[1] || +inp[0]]; var min = Math.min(range[0], range[1]); var max = Math.max(range[0], range[1]); var result = []; for (var i = min; i <= max; i++) result.push(i); if (range[0] > range[1]) result.reverse(); return result; }; });
uso
3 2 1 0 -1 -2 -3
-3 -2 -1 0 1 2 3
0 1 2 3
0 -1 -2 -3
Intenté lo siguiente y funcionó bien para mí:
{{position}}
Angular 1.3.6
Esta es la respuesta mejorada de jzm (no puedo comentar otra cosa, comentaría su respuesta porque incluía errores). La función tiene un valor de rango de inicio / final, por lo que es más flexible y … funciona. Este caso particular es para el día del mes:
$scope.rangeCreator = function (minVal, maxVal) { var arr = []; for (var i = minVal; i <= maxVal; i++) { arr.push(i); } return arr; };
Hola, puedes lograrlo usando html puro usando AngularJS (¡NO se requiere ninguna directiva!)
{{ person.first + ' ' + person.last }}
Arreglé esto y vi que podría ser útil para algunos. (Sí, CoffeeScript. Demandeme)
app.directive 'times', -> link: (scope, element, attrs) -> repeater = element.html() scope.$watch attrs.times, (value) -> element.html '' return unless value? element.html Array(value + 1).join(repeater)
Usar:
Tarde a la fiesta. Pero terminé haciendo esto:
En tu controlador:
$scope.repeater = function (range) { var arr = []; for (var i = 0; i < range; i++) { arr.push(i); } return arr; }
Html:
Si desea lograr esto en html sin ningún controlador o fábrica.
Esta es la variante más simple: simplemente use una matriz de enteros ….
test {{n}}