Angularは、HTMLディレクティブ内の数値を使用したforループをある程度サポートしています。
<div data-ng-repeat="i in [1,2,3,4,5]">
do something
</div>
しかし、あなたのscope変数が動的な数値を持つ範囲を含んでいるなら、毎回空の配列を作成する必要があるでしょう。
コントローラーで
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>
私は2つの定義された数の間の範囲を作成するための、もっと単純なバージョンを思いつきました。 5〜15
_ 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番をする
何か2番
何か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>
以下のコードは、アプリケーションの全範囲で利用可能なメソッドrange()
を定義しますMyApp
。その動作は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<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,
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,
Angular.filterモジュールで '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
コントローラを変更しなくても、これを使用できます。
ng-repeat="_ in ((_ = []) && (_.length=51) && _) track by $index"
楽しい!
JS(あなたのAngularJSコントローラ内)
$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 }}
UnderscoreJSを使用する:
angular.module('myModule')
.run(['$rootScope', function($rootScope) { $rootScope.range = _.range; }]);
これを$rootScope
に適用すると、どこでも利用できるようになります。
<div ng-repeat="x in range(1,10)">
{{x}}
</div>
こんにちはあなたは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>
とてもシンプルなもの:
$scope.totalPages = new Array(10);
<div id="pagination">
<a ng-repeat="i in totalPages track by $index">
{{$index+1}}
</a>
</div>
パーティーに遅れた。しかし、私はこれをやっただけでした:
あなたのコントローラで:
$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>
@ 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
これはjzmの改善された答えです(私は他の人がコメントすることができません私は彼女/彼の答えをコメントしますs /彼はエラーを含んでいたので)。この関数は開始/終了範囲値を持っているので、もっと柔軟で、そしてうまくいきます。この特定のケースは月の日のためです:
$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>
私は以下を試しました、そして、それは私のためにちょうどうまくいきました:
<md-radio-button ng-repeat="position in formInput.arrayOfChoices.slice(0,6)" value="{{position}}">{{position}}</md-radio-button>
角度1.3.6
スコープをコントローラに設定します
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>
私はこれを完成させて、それがある人には役に立つかもしれないのを見ました。 (はい、CoffeeScriptです。私を言ってください)
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)
使用するには:
<div times="customer.conversations_count">
<i class="icon-picture></i>
</div>
これはもっと簡単になりますか?
Angularは常に正当な理由もなくそれらを再評価することを好むので、私はフィルタについては用心深く、そして私がそうであるようにそれらの何千ものフィルタがあるならそれは大きなボトルネックになります。
このディレクティブはモデルの変更を監視し、それに応じて要素を更新します。
<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でこれを達成したいならば。