배열을 반복하는 대신 정의 된 횟수만큼 ng-repeat하는 방법은 무엇입니까?
배열을 항상 반복하는 대신 정의 된 횟수만큼 ng-repeat하는 방법이 있습니까?
예를 들어 아래에서 목록 항목을 5로 가정 $scope.number
하고 숫자를 증가 시키면서 5를 표시하여 각 목록 항목이 1, 2, 3, 4, 5와 같이 증가하도록합니다.
원하는 결과 :
<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>
현재는 ng-repeat
컬렉션으로 만 매개 변수를 허용하지만 다음과 같이 할 수 있습니다.
<ul>
<li ng-repeat="i in getNumber(number)"><span>{{$index+1}}</span></li>
</ul>
컨트롤러 어딘가에 :
$scope.number = 5;
$scope.getNumber = function(num) {
return new Array(num);
}
그러면 $scope.number
원하는 바인딩을 원하는대로 변경 하고 계속 유지할 수 있습니다.
다음은 동일한 getNumber
기능을 사용하는 몇 가지 목록 이있는 바이올린 입니다 .
EDIT 1/6/2014 : 최신 버전의 Angular 1.x는 다음 구문을 사용합니다.
<li ng-repeat="i in getNumber(number) track by $index">
EDIT 9/25/2018 : 최신 버전의 Angular 1.x를 사용하면 기능 없이이 작업을 수행 할 수 있습니다. 코드가 단순하고 getNumber
다른 이유로 함수 가 필요하지 않은 경우 이제 생략하고 다음을 수행 할 수 있습니다.
<div ng-repeat="x in [].constructor(number) track by $index">
이 업데이트에 대한 아래 답변에서 @Nikhil Nambiar의 기여
당신은 이것을 할 수 있습니다 :
<div ng-repeat="i in [1, 2, 3, 4]">
...
</div>
이 작업을 수행하는 방법의 예는 다음과 같습니다. 나는 ng-repeat 문서의 의견에서 영감을 얻었습니다 : http://jsfiddle.net/digitalzebra/wnWY6/
ng-repeat 지시문에 유의하십시오.
<div ng-app>
<div ng-controller="TestCtrl">
<div ng-repeat="a in range(5) track by $index">{{$index + 1}}</div>
</div>
</div>
컨트롤러는 다음과 같습니다.
function TestCtrl($scope) {
$scope.range = function(n) {
return new Array(n);
};
};
나는이 생각 jsFiddle를 이에서 스레드 당신이 찾고있는 무슨 수 있습니다.
<div ng-app ng-controller="Main">
<div ng-repeat="item in items | limitTo:2">
{{item.name}}
</div>
</div>
더 간단한 접근법은 다음과 같습니다 (예 : 5 배).
<div ng-repeat="x in [].constructor(5) track by $index">
...
</div>
나는 같은 문제에 부딪쳤다. 나는이 스레드를 보았지만 여기에있는 방법을 좋아하지 않았습니다. 내 솔루션은 우리가 이미 설치 한 underscore.js를 사용하고있었습니다. 다음과 같이 간단합니다.
<ul>
<li ng-repeat="n in _.range(1,6)"><span>{{n}}</span></li>
</ul>
이것은 당신이 찾고있는 것을 정확하게 할 것입니다.
내 HTML을 매우 작게 유지하고 싶었으므로 다른 사람들이했던 것처럼 배열 [0,1,2, ...]을 만드는 작은 필터를 정의했습니다.
angular.module('awesomeApp')
.filter('range', function(){
return function(n) {
var res = [];
for (var i = 0; i < n; i++) {
res.push(i);
}
return res;
};
});
그 후에보기에서 다음과 같이 사용할 수 있습니다.
<ul>
<li ng-repeat="i in 5 | range">
{{i+1}} <!-- the array will range from 0 to 4 -->
</li>
</ul>
이것은 실제로 추악하지만 정수 또는 변수에 대한 컨트롤러없이 작동합니다.
정수:
<span ng-repeat="_ in ((_ = []) && (_.length=33) && _) track by $index">{{$index}}</span>
변하기 쉬운:
<span ng-repeat="_ in ((_ = []) && (_.length=myVar) && _) track by $index">{{$index}}</span>
이를 수행하는 방법에는 여러 가지가 있습니다. 컨트롤러에 로직을 사용하는 데 실제로 귀찮았으므로 요소 n 번 반복 문제를 해결하는 간단한 지시문을 만들었습니다.
설치:
지시문은 다음을 사용하여 설치할 수 있습니다. bower install angular-repeat-n
예:
<span ng-repeat-n="4">{{$index}}</span
생산 : 1234
범위 변수를 사용하여 작동합니다.
<span ng-repeat-n="repeatNum"></span>
출처:
이것은 허용 된 답변의 약간의 변형 일뿐이지만 실제로 새로운 기능 을 만들 필요는 없습니다 . 범위에서 '배열'을 가져 오는 경우에만 :
<div ng-app="myapp">
<div ng-controller="ctrlParent">
<ul>
<li ng-repeat="i in counter(5) track by $index">
<span>{{$index+1}}</span></li>
</ul>
</div>
</div>
var app = angular.module('myapp',[]);
app.controller('ctrlParent',function($scope){
$scope.myNumber = 5;
$scope.counter = Array;
});
실제 예는 이 바이올린 을 참조하십시오 .
가장 쉬운 답변 : 2 줄의 코드
JS (AngularJS 컨트롤러에서)
$scope.range = new Array(MAX_REPEATS); // set MAX_REPEATS to the most repetitions you will ever need in a single ng-repeat that makes use of this strategy
HTML
<div ng-repeat="i in range.slice(0,repeatCount) track by $index"></div>
... repeatCount
이 위치에 나타나는 반복 횟수입니다.
angular는 slice 라는 매우 달콤한 기능을 제공합니다 . 이것을 사용하면 원하는 것을 얻을 수 있습니다. 예 : ng-repeat = "abc.slice (startIndex, endIndex)의 ab" "
이 데모 : http://jsfiddle.net/sahilosheal/LurcV/39/ 는이 "삶을 편하게"기능을 사용하는 방법을 알려줍니다. :)
html :
<div class="div" ng-app >
<div ng-controller="Main">
<h2>sliced list(conditional NG-repeat)</h2>
<ul ng-controller="ctrlParent">
<li ng-repeat="ab in abc.slice(2,5)"><span>{{$index+1}} :: {{ab.name}} </span></li>
</ul>
<h2>unsliced list( no conditional NG-repeat)</h2>
<ul ng-controller="ctrlParent">
<li ng-repeat="ab in abc"><span>{{$index+1}} :: {{ab.name}} </span></li>
</ul>
</div>
CSS :
ul
{
list-style: none;
}
.div{
padding:25px;
}
li{
background:#d4d4d4;
color:#052349;
}
ng-JS :
function ctrlParent ($scope) {
$scope.abc = [
{ "name": "What we do", url: "/Home/AboutUs" },
{ "name": "Photo Gallery", url: "/home/gallery" },
{ "name": "What we work", url: "/Home/AboutUs" },
{ "name": "Photo play", url: "/home/gallery" },
{ "name": "Where", url: "/Home/AboutUs" },
{ "name": "playground", url: "/home/gallery" },
{ "name": "What we score", url: "/Home/AboutUs" },
{ "name": "awesome", url: "/home/gallery" },
{ "name": "oscar", url: "/Home/AboutUs" },
{ "name": "american hustle", url: "/home/gallery" }
];
}
function Main($scope){
$scope.items = [{sort: 1, name: 'First'},
{sort: 2, name: 'Second'},
{sort: 3, name: 'Third'},
{sort: 4, name:'Last'}];
}
각도 1.2.x에 대한 답변은 다음과 같습니다.
기본적으로는 약간의 수정으로 동일합니다. ng-repeat
<li ng-repeat="i in getNumber(myNumber) track by $index">
여기 바이올린이 있습니다 : http://jsfiddle.net/cHQLH/153/
각도 1.2는 지시문에서 중복 값을 허용하지 않기 때문입니다. 즉, 다음을 수행하려고하면 오류가 발생합니다.
<li ng-repeat="x in [1,1,1]"></li>
ng-if
지시문과 함께 사용할 수 있습니다ng-repeat
따라서 num이 횟수 인 경우 요소를 반복해야합니다.
<li ng-repeat="item in list" ng-if="$index < num">
이 예제를 사용할 수 있습니다.
내부 컨트롤러 :
$scope.data = {
'myVal': 33,
'maxVal': 55,
'indexCount': function(count) {
var cnt = 10;
if (typeof count === 'number') {
cnt = count;
}
return new Array(cnt);
}
};
HTML 코드 측면에서 select 요소의 예 :
<select ng-model="data.myVal" value="{{ data.myVal }}">
<option ng-repeat="i in data.indexCount(data.maxVal) track by $index" value="{{ $index + 1 }}">{{ $index + 1 }}</option>
</select>
CoffeeScript를 사용하는 사용자의 경우 범위 이해를 사용할 수 있습니다.
지령
link: (scope, element, attrs) ->
scope.range = [1..+attrs.range]
또는 컨트롤러
$scope.range = [1..+$someVariable]
$scope.range = [1..5] # Or just an integer
주형
<div ng-repeat="i in range">[ the rest of your code ]</div>
Ivan의 첫 번째 대답에서 비트를 조금 확장하면 문자가 고유 한 경우 트랙별로 문을 사용하지 않고 문자열을 컬렉션으로 사용할 수 있습니다. 따라서 유스 케이스가 10 숫자 미만이면 질문처럼 :
<ul>
<li ng-repeat="n in '12345'"><span>{{n}}</span></li>
</ul>
어느 것이 약간 기이하지만 확실하지만 혼란스럽지 않을 정도로 간단합니다.
먼저 LoDash를 사용하여 각도 필터를 만듭니다.
angular.module('myApp').filter('times', function(){
return function(value){
return _.times(value || 0);
}
});
LoDash 시간 함수는 null, undefined, 0, 숫자 및 숫자의 문자열 표현을 처리 할 수 있습니다.
그런 다음 HTML에서 다음과 같이 사용하십시오.
<span ng-repeat="i in 5 | times">
<!--DO STUFF-->
</span>
또는
<span ng-repeat="i in myVar | times">
<!--DO STUFF-->
</span>
반복을 증가시킬 수있는보다 역동적 인 솔루션이 필요했습니다.
HTML
<div ng-repeat="n in newUserCount">
<input type="text" value="" name="newuser{{n}}"/>
</div>
복사기 제어
<span class="helper" ng-click="duplicateUser()">
Create another user with the same permissions
</span>
JS
$scope.newUserCount = Array('1');
var primaryValue = 1;
$scope.duplicateUser = function()
{
primaryValue++;
$scope.newUserCount.push(primaryValue)
}
Angular는 컬렉션을 수정하는 필터를 제공합니다. 이 경우 컬렉션은 null (예 : [])이되고 필터는 다음과 같이 인수도 사용합니다.
<div id="demo">
<ul>
<li ng-repeat="not in []|fixedNumber:number track by $index">{{$index}}</li>
</ul>
</div>
JS :
module.filter('fixedNumber', function() {
return function(emptyarray, number) {
return Array(number);
}
});
module.controller('myCtrl', ['$scope', function($scope) {
$scope.number = 5;
}]);
이 방법은 위에서 제안한 방법과 매우 유사하며 반드시 우수하지는 않지만 AngularJS의 필터 성능을 보여줍니다.
n이 너무 높지 않은 경우 다른 옵션은 n 문자 문자열과 함께 split ( '')을 사용하는 것입니다.
<div ng-controller="MainCtrl">
<div ng-repeat="a in 'abcdefgh'.split('')">{{$index}}</div>
</div>
나는 같은 문제에 직면했고 이것이 내가 나온 것입니다.
(function () {
angular
.module('app')
.directive('repeatTimes', repeatTimes);
function repeatTimes ($window, $compile) {
return { link: link };
function link (scope, element, attrs) {
var times = scope.$eval(attrs.repeatTimes),
template = element.clone().removeAttr('repeat-times');
$window._(times).times(function (i) {
var _scope = angular.extend(scope.$new(), { '$index': i });
var html = $compile(template.clone())(_scope);
html.insertBefore(element);
});
element.remove();
}
}
})();
... 그리고 HTML :
<div repeat-times="4">{{ $index }}</div>
times
프로젝트에서 이미 밑줄의 기능을 사용했지만 기본 코드로 쉽게 바꿀 수 있습니다.
최대 번호가 다른 ng-repeat에서 나오는 재사용 가능한 지시문을 만들고 있습니다. 따라서 이것은 최고의 투표 답변을 편집 한 것입니다.
컨트롤러의 코드를 다음과 같이 변경하십시오.
$scope.getNumber = function(num) {
var temp = [];
for(var j = 0; j < num; j++){
temp.push(j)
}
return temp;
}
지정된 반복 횟수로 새 배열을 반환합니다.
문자열을 반복하기 때문에 각 문자에 대한 항목을 렌더링합니다.
<li ng-repeat = "k in 'aaaa' track by $index">
{{$index}} //THIS DOESN'T ANSWER OP'S QUESTION. Read below.
</li>
네이티브 필터를 사용하여이 추악 하지만 코드가없는 해결 방법을 사용할 수 있습니다 number|n decimal places
.
<li ng-repeat="k in (0|number:mynumber -2 ) track by $index">
{{$index}}
</li>
이런 식으로 mynumber
추가 코드가없는 요소를 갖게 됩니다. 말해봐 '0.000'
.
우리는 mynumber - 2
보상 하기 위해 사용 0.
합니다. 3 이하의 숫자에서는 작동하지 않지만 경우에 따라 유용 할 수 있습니다.
$scope.number = 5;
<div ng-repeat="n in [] | range:$scope.number">
<span>{{$index}}</span>
</div>
간단한 방법 :
public defaultCompetences: Array<number> = [1, 2, 3];
구성 요소 / 컨트롤러에서 다음을 수행하십시오.
<div ng-repeat="i in $ctrl.defaultCompetences track by $index">
이 코드는 내 타이프 스크립트 프로젝트에서 가져온 것이지만 순수한 자바 스크립트로 재 배열 될 수 있습니다
'development' 카테고리의 다른 글
최대 절전 모드는 동시에 여러 개의 백을 가져올 수 없습니다 (0) | 2020.02.20 |
---|---|
각각을 사용할 때 목록 대 튜플? (0) | 2020.02.20 |
Apache2 : 'AH01630 : 클라이언트가 서버 구성에 의해 거부되었습니다' (0) | 2020.02.20 |
자바 스크립트에서 float 형식을 지정하는 방법은 무엇입니까? (0) | 2020.02.20 |
모든 자식 커밋을 하나로 스쿼시하는 방법은 무엇입니까? (0) | 2020.02.20 |