programing

숫자와 범위가 있는 루프용 AngularJS

minimums 2023. 4. 3. 21:23
반응형

숫자와 범위가 있는 루프용 AngularJS

Angular는 HTML 명령어 내의 숫자를 사용하여 for 루프를 지원합니다.

<div data-ng-repeat="i in [1,2,3,4,5]">
  do something
</div>

단, 스코프 변수에 다이내믹 번호를 가진 범위가 포함되어 있는 경우 매번 빈 배열을 작성해야 합니다.

컨트롤러 내

var range = [];
for(var i=0;i<total;i++) {
  range.push(i);
}
$scope.range = range;

HTML에서

<div data-ng-repeat="i in range">
  do something
</div>

이것은 동작합니다만, 루프내에서 범위 배열을 전혀 사용하지 않기 때문에, 불필요합니다.최소값/최대값의 범위 또는 정수를 설정하는 방법을 아는 사람이 있습니까?

예를 들어 다음과 같습니다.

<div data-ng-repeat="i in 1 .. 100">
  do something
</div>

는 이 답을 조금 수정해서 이 바이올린을 생각해냈다.

필터 정의:

var myApp = angular.module('myApp', []);
myApp.filter('range', function() {
  return function(input, total) {
    total = parseInt(total);

    for (var i=0; i<total; i++) {
      input.push(i);
    }

    return input;
  };
});

다음과 같이 반복하여 사용합니다.

<div ng-repeat="n in [] | range:100">
  do something
</div>

정의된 두 숫자 사이의 범위를 만들기 위해 더 간단한 버전을 생각해냈습니다. 예를 들어 5에서 15 사이입니다.

JSFiddle 데모 보기

HTML:

<ul>
    <li ng-repeat="n in range(5,15)">Number {{n}}</li>
</ul>

컨트롤러:

$scope.range = function(min, max, step) {
    step = step || 1;
    var input = [];
    for (var i = min; i <= max; i += step) {
        input.push(i);
    }
    return input;
};

단순한 Javascript(컨트롤러도 필요 없음):

<div ng-repeat="n in [].constructor(10) track by $index">
    {{ $index }}
</div>

목업시 매우 편리함

조금 더 적합한 구문을 생각해 냈고 옵션 하한도 추가했습니다.

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;
        };
    });

사용하실 수 있습니다.

<div ng-repeat="n in [10] | makeRange">Do something 0..9: {{n}}</div>

또는

<div ng-repeat="n in [20, 29] | makeRange">Do something 20..29: {{n}}</div>

angularjs를 처음 접하는 분들을 위해.인덱스는 $index를 사용하여 얻을 수 있습니다.

예를 들어 다음과 같습니다.

<div ng-repeat="n in [] | range:10">
    do something number {{$index}}
</div>

Gloopy의 편리한 필터를 사용하면 다음과 같이 인쇄할 수 있습니다.
0번 일을 하다
제1의 일을 하다
두 번째 일을 하다
3번 일을 하다
4번 일을 하다
5번 일을 하다
6번 일을 하다
7번 일을 하다
8번 일을 하다
9번 일을 하다

간단한 방법은 Underscore.js의 _.range() 메서드를 사용하는 것입니다.:)

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.
<div ng-repeat='val in range'>
    {{ $index }}: {{ val }}
</div>

나는 내 습관을 사용한다.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);
        }
    };
}]);

html 코드는

<div ng-repeat-range from="0" to="20" step="5">
    Hello 4 times!
</div>

또는 간단히 말하면

<div ng-repeat-range from="5" to="10">
    Hello 5 times!
</div>

또는 단순히

<div ng-repeat-range to="3">
    Hello 3 times!
</div>

아니면 그냥

<div ng-repeat-range="7">
    Hello 7 times!
</div>

가장 간단한 코드 없음 솔루션은 범위를 가진 배열을 초기화하고 $index +를 사용하는 것입니다.

<select ng-init="(_Array = []).length = 5;">
    <option ng-repeat="i in _Array track by $index">{{$index+5}}</option>
</select>

컨트롤러를 변경하지 않고 다음을 사용할 수 있습니다.

ng-repeat="_ in ((_ = []) && (_.length=51) && _) track by $index"

맛있게 드세요!

메서드의 정의

아래 코드는 메서드를 정의합니다.range()어플리케이션의 모든 범위에서 이용 가능MyApp동작은 Python 메서드와 매우 유사합니다.

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<max; value+=step) {
            output.push(value);
        }
        // returning the generated array
        return output;
    };
}]);

사용.

파라미터 1개:

<span ng-repeat="i in range(3)">{{ i }}, </span>

0, 1, 2,

다음 두 가지 매개 변수:

<span ng-repeat="i in range(1, 5)">{{ i }}, </span>

1, 2, 3, 4,

다음 3가지 파라미터가 있습니다.

<span ng-repeat="i in range(-2, .7, .5)">{{ i }}, </span>

-2, -1.5, -1, -0.5, 0, 0.5,

'after' 또는 'before' 필터를 각도별로 사용할 수 있습니다.필터 모듈(https://github.com/a8m/angular-filter)

$scope.list = [1,2,3,4,5,6,7,8,9,10]

HTML:

<li ng-repeat="i in list | after:4">
  {{ i }}
</li>

결과: 5, 6, 7, 8, 9, 10

최단 응답: 코드 2줄

JS(각도로)JS 컨트롤러)

$scope.range = new Array(MAX_REPEATS); // MAX_REPEATS should be the most repetitions you will ever need in a single ng-repeat

HTML

<div data-ng-repeat="i in range.slice(0,myCount) track by $index"></div>

서...어디에myCount는 이 위치에 표시되는 별의 수입니다.

하시면 됩니다.$index, 과 같이 하면 됩니다.div:

{{ ($index + 1) * 0.5 }}

안녕하세요. AngularJS를 사용하여 순수 html을 사용하여 이 작업을 수행할 수 있습니다(지시는 필요 없습니다).

<div ng-app="myapp" ng-controller="YourCtrl" ng-init="x=[5];">
  <div ng-if="i>0" ng-repeat="i in x">
    <!-- this content will repeat for 5 times. -->
    <table class="table table-striped">
      <tr ng-repeat="person in people">
         <td>{{ person.first + ' ' + person.last }}</td>
      </tr>
    </table>
    <p ng-init="x.push(i-1)"></p>
  </div>
</div>

밑줄 사용JS:

angular.module('myModule')
    .run(['$rootScope', function($rootScope) { $rootScope.range = _.range; }]);

을 것을 applying applying applying$rootScope모든 장소에서 사용할 수 있습니다.

<div ng-repeat="x in range(1,10)">
    {{x}}
</div>

매우 간단한 것:

$scope.totalPages = new Array(10);

 <div id="pagination">
    <a ng-repeat="i in totalPages track by $index">
      {{$index+1}}
    </a>   
 </div> 

컨트롤러에서 범위 설정

var range = [];
for(var i=20;i<=70;i++) {
  range.push(i);
}
$scope.driverAges = range;

HTML 템플릿 파일에서 반복 설정

<select type="text" class="form-control" name="driver_age" id="driver_age">
     <option ng-repeat="age in driverAges" value="{{age}}">{{age}}</option>
</select>

@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;
  };
});

사용.

<span ng-repeat="n in [3, -3] | makeRange" ng-bind="n"></span>

3 2 1 0 -1 -2 -3

<span ng-repeat="n in [-3, 3] | makeRange" ng-bind="n"></span>

-3 -2 -1 0 1 2 3

<span ng-repeat="n in [3] | makeRange" ng-bind="n"></span>

0 1 2 3

<span ng-repeat="n in [-3] | makeRange" ng-bind="n"></span>

0 -1 -2 -3

다음을 시도했지만 잘 작동했습니다.

<md-radio-button ng-repeat="position in formInput.arrayOfChoices.slice(0,6)" value="{{position}}">{{position}}</md-radio-button>

각도 1.3.6

파티에 늦었다.하지만 결국엔 이렇게 됐어

컨트롤러 내:

$scope.repeater = function (range) {
    var arr = []; 
    for (var i = 0; i < range; i++) {
        arr.push(i);
    }
    return arr;
}

HTML:

<select ng-model="myRange">
    <option>3</option>
    <option>5</option>
</select>

<div ng-repeat="i in repeater(myRange)"></div>

이것은 jzm의 개선된 답변입니다(그렇지 않으면 에러가 포함되어 있기 때문에 코멘트하겠습니다).함수는 시작/종료 범위 값을 가지고 있기 때문에 유연성이 더 높습니다.그건 효과가 있다.이 특정 케이스는 요일에 대한 것입니다.

$scope.rangeCreator = function (minVal, maxVal) {
    var arr = [];
   for (var i = minVal; i <= maxVal; i++) {
      arr.push(i);
   }
   return arr;
};


<div class="col-sm-1">
    <select ng-model="monthDays">
        <option ng-repeat="day in rangeCreator(1,31)">{{day}}</option>
    </select>
</div>
<div ng-init="avatars = [{id : 0}]; flag = true ">
  <div ng-repeat='data in avatars' ng-if="avatars.length < 10 || flag"
       ng-init="avatars.length != 10 ? avatars.push({id : $index+1}) : ''; flag = avatars.length <= 10 ? true : false">
    <img ng-src="http://actual-names.com/wp-content/uploads/2016/01/sanskrit-baby-girl-names-400x275.jpg">
  </div>
</div>

컨트롤러나 공장 없이 html로 이 작업을 수행할 경우.

나는 이것을 재빨리 만들고 그것이 몇몇 사람들에게 유용할 수 있다는 것을 알았다.(네, Coffee Script.고소해 주세요.)

지시.

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)

사용 방법:

HTML

<div times="customer.conversations_count">
  <i class="icon-picture></i>
</div>

좀 더 간단하게 할 수 없을까?

Angular는 항상 정당한 이유 없이 필터를 재평가하는 것을 좋아하기 때문에 필터가 걱정됩니다. 그리고 저처럼 수천 개의 필터가 있으면 큰 병목현상이 됩니다.

이 지시어는 모델의 변경 사항도 감시하고 그에 따라 요소를 업데이트합니다.

가정하다$scope.refernceurl.

for(var i=0; i<$scope.refernceurl.length; i++){
    $scope.urls+=$scope.refernceurl[i].link+",";
}

이것은 가장 단순한 변형입니다.정수의 배열을 사용합니다.

 <li ng-repeat="n in [1,2,3,4,5]">test {{n}}</li>

언급URL : https://stackoverflow.com/questions/11873570/angularjs-for-loop-with-numbers-ranges

반응형