Я хочу повторить этот код для каждого элемента в моем массиве:
<div class="container" ng-init="parentIndex = $index" ng-repeat="urn in apsocket.mensajes | filter:searchTextURN">
<button style="width:100%" type="button" class="btn btn-info" data-toggle="collapse" data-target="{{'#urn_'+$index}}">{{urn.urn }}</button>
<div id="{{'urn_'+$index}}" class="collapse">
{{urn.timestamp}}
<br>
<p>
<div align="right" ng-repeat="meas in urn.measurements track by $index">
<button style="width:90%;background-color: #68ec6a;border-color:#8bf48c;" type="button" class="btn btn-success" data-toggle="collapse" data-target="{{'#meas_'+parentIndex + '_' +$index}}">{{meas.phenomenon}} </button>
<div style="width:90%" id="{{'meas_'+parentIndex + '_' +$index}}" class="collapse">
{{meas.value + ' ' + meas.uom}}
</div>
</div>
</p>
</div>
</div>
Но, хотя первая кнопка в каждой строке отлично работает и создает рабочую разборку, внутренние ng-повторы выглядят не так.
Каждый внутренний элемент в каждой строке наружу имеет одинаковый идентификатор. Таким образом, для каждого "контейнера" parentIndex является одним и тем же и начинается с 0.
Что мне делать в этом случае? Это не фиксированный массив, который я загружаю в начале. Этот массив получает данные от сокета, и он становится больше при каждом получении сообщения.
Если вам нужен еще какой-то код, просто спросите.
Я бы порекомендовал просто использовать чистый угловой путь. В повторении каждый элемент имеет свою собственную область, поэтому вы можете сделать ng-click = "collapse =! Collapse" (что-то в этом роде), я сделал вам пример здесь
Для примера я просто создал фальшивую структуру данных
<ul>
<li ng-repeat="item in objs" ng-click="collapse = ! collapse">
{{item.id}}
<ul ng-show="item.more.length > 0 && collapse">
<li ng-repeat="child in item.more" ng-click="collapse = ! collapse; $event.stopPropagation();" >
{{child.id}}
<ul ng-show="child.more.length > 0 && collapse">
<li ng-repeat="baby in child.more">
{{baby.id}}
</li>
</ul>
</li>
</ul>
</li>
</ul>
Если вы хотите использовать класс collapse для анимации или что-то еще, вы можете изменить часть ng-show, которая сворачивается в
ng-class="{ 'collapse' : collapse }"
Первый "коллапс" - это любой класс, который вы хотите переключить.
Вам не нужно использовать ng-init="parentIndex = $index"
. Вы можете получить доступ к родительскому $index
как этот $parent.$index
.
Каждый ng-repeat
создает новую область, поэтому вы можете получить доступ к родительскому элементу с помощью ключевого слова $parent
.
Демо-версия:
var app = angular.module('app',[]);
app.controller('ctrl', function($scope) {
$scope.items = [0, 1, 2, 3, 4];
});
<div ng-app="app" ng-controller="ctrl">
<ul>
<li ng-repeat="item in items track by $index">
<ul>
<li ng-repeat="item in items track by $index">
parent: {{$parent.$index}}
current: {{$index}}
</li>
</ul>
</li>
</ul>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>