Вложенный ng-repeat $parent. $index и $index

У меня странная ошибка, которая, к сожалению, я не могу реплицировать с помощью jsfiddle. Я прокомментировал весь мой код (кроме библиотек и т.д.), За исключением следующих фрагментов. Есть ли что-то очевидное, что я не понимаю? Любые идеи?

Это работает и печатает: (0,0) (0,1) (1,0) (1,1)

<div ng-repeat="i in list">
    <div ng-repeat="j in list2">
        <div>
            ({{$parent.$index}} {{$index}})
        </div>
    </div>
</div>

Однако этот фрагмент кода печатает: (0,0) (1,1) (0,0) (1,1)

<div ng-repeat="i in list">
    <div ng-repeat="j in list2">
        <div ng-if="1">
            ({{$parent.$index}} {{$index}})
        </div>
    </div>
</div>

Мой контроллер:

$scope.list  = [1, 2];
$scope.list2 = [1, 2];

Ответы

Ответ 1

DEMO FIDDLE

Это потому, что директива ng-if создает новую область для себя, когда вы ссылаетесь на $parent, она обращается к непосредственной области $parent, то есть к области внутреннего повторения.

Итак, если вы хотите достичь чего-то, чего хотели, как в первом, вы можете использовать это:

<div ng-repeat="i in list">
    <div ng-repeat="j in list2">
        <div ng-if="1">
            ({{$parent.$parent.$index}} {{$parent.$index}})
        </div>
    </div>
</div>

если у вас есть несколько внутренних директив, вы можете использовать ng-init для хранения $index в переменной для ссылок в дочерних областях.

<div ng-repeat="i in list" ng-init="outerIndex=$index">
    <div ng-repeat="j in list2" ng-init="innerIndex=$index">
        <div ng-if="1">
            ({{outerIndex}} {{innerIndex}})
        </div>
    </div>
</div>

Я настоятельно рекомендую вам ознакомиться с этой статьей в областях знаний в angular

Ответ 2

Вместо использования ng-init вы можете использовать синтаксис (key, value) ng-repeat для получения родительского индекса.

DEMO

<div ng-repeat="(iKey, i) in list">
    <div ng-repeat="j in list2">
        <div ng-if="1">
            ({{iKey}} {{$index}})
        </div>
    </div>
</div>

Ответ 3

просмотрите PLUNK

ng-if создает новую дочернюю область, из-за которой необходимо добавить $parent. Я создал свойство myname, которое сообщает имя области, с помощью которого вы можете проверить, что именно происходит.

<div ng-if="1">
    ({{$parent.$parent.$index}} {{$parent.$index}})
</div>

Ответ 4

В ng-if вводится другая область видимости, поэтому одного $parent. недостаточно.

Вы можете удвоить его так: $parent.$parent.$index или запомнить индекс внешнего ng-repeat в другой переменной через ng-init следующим образом:

<div ng-repeat="i in list" ng-init="listIndex = $index">
  <div ng-repeat="j in list2">
    <div ng-if="1">
      ({{listIndex}} {{$index}})
    </div>
  </div>
</div>

Пример plunker: http://plnkr.co/edit/dtaBAmkU32BCsLASLs0C?p=preview