Содержание

Директива ng-repeat

Директива ng-repeat позволяет производить обход массивов в стиле цикла for-each и генерировать для них элементы html. Например, при рассмотрении контроллеров мы создали контроллер phoneController. Изменим его так, чтобы он передавал в представление массив:

var myApp=angular.module('myApp');
myApp.controller('phoneController', function($scope) {
 
  $scope.phones = [{
        name: 'Nokia Lumia 630',
        year: 2014,
        price: 200,
        company: {
            name: 'Nokia',
            country: 'Финляндия'
        }
    },{
        name: 'Samsung Galaxy S 4',
        year: 2014,
        price: 400,
        company: {
            name: 'Samsung',
            country: 'Республика Корея'
        }
    },{
        name: 'Mi 5',
        year: 2015,
        price: 300,
        company: {
            name: 'Xiaomi',
            country: 'Китай'
        }
    }]
});

И чтобы вывести все элементы массива, применим директиву ng-repeat:

<!doctype html>
<html ng-app="myApp">
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="css/mystyles.css" />
</head>
<body>
 
<div ng-controller="phoneController">
<ul>
<li ng-repeat="phone in phones">
<b>{{phone.name}}</b>
<p>Цена: {{phone.price}} $</p>
<p>Производитель: {{phone.company.name}}</p>
</li>
</ul>
</div>
<script src="js/lib/angular.min.js"></script>
<script type="text/javascript">
angular.module('myApp', []);
</script>
<script src="js/controllers/phonesController.js"></script>
</body>
</html>

В данном случае с помощью выражения <li ng-repeat=«phone in phones»> у нас будет создаваться для каждого объекта в наборе phones элемент li, который будет содержать определенную информацию.

Встроенные переменные

При обходе массивов мы можем использовать ряд встроенных переменных AngularJS:

Используем пару переменных:

<!doctype html>
<html ng-app="myApp">
<head>
<meta charset="utf-8">
<style>
.odd { background-color: #fafafa;}
.even { background-color: silver}
</style>
</head>
<body>
<div ng-controller="phoneController">
<table class="table">
<thead>
<tr>
<th>Id</th>
<th>Модель</th>
<th>Цена</th>
</tr>
</thead>
<tr ng-repeat="phone in phones" ng-class="$odd ? 'odd' : 'even'">
<td>{{$index + 1}}</td>
<td>{{phone.name}}</td>
<td>{{phone.price}}</td>
</tr>
</table>
</div>
<script src="js/lib/angular.min.js"></script>
<script type="text/javascript">
angular.module('myApp', []);
</script>
<script src="js/controllers/phonesController.js"></script>
</body>
</html>

Обход внутренних массивов

Возможна ситуация, когда объект в массиве, в свою очередь, сам содержит массив, и этот массив тоже надо обойти. В этом случае можно использовать вложеные директивы ng-repeat. Например, весь объект выглядит так:

$scope.phones = [{
        name: 'Nokia',
        models:[{
            name: "Nokia Lumia 530",
            price: 150
        },{
            name: "Nokia X2",
            price: 200
        }]
    },{
        name: 'Samsung',
        models:[{
            name: "Samsung Galaxy S5",
            price: 500
        },{
            name: "Samsung Galaxy Alpha",
            price: 400
        }]
    }]
});

Для вывода вложенного массива можно использовать следующий код:

<div ng-controller="phoneController">
    <ul>
        <li ng-repeat="company in phones">
            <p>{{company.name}}</p>
            <ul ng-repeat="model in company.models">
                <b>{{model.name}}</b>
                <p>Цена: {{model.price}} $</p>
            </ul>
        </li>
    </ul>
</div>