С AngularJS документы:
Директива ngInit позволяет оценить выражение в текущей области.
Теперь. Вы работаете с другой областью.
Вы используете ngInit в включенной области , переопределяя $ scope.rank каждый раз, когда повторяет эту часть шаблона.
Если вы хотите сохранить свой ранг, вам следует ввести его в область действия ngRepeat .
Попробуйте с:
<li ng-repeat="item in ctrl.getItems()" ng-init="rank = $index">
[$index: {{$index}}]
{{item}}<br/>
<label>
Move to
<input type="number" ng-model="rank"/>
</label>
<button type="button" ng-click="ctrl.moveItem($index, rank)">
Ok
</button>
</li>
Отредактированный ответ
Хорошо, я понял.
Выражение ngInit вычисляется только тогда, когда эта часть шаблона будет отображена в DOM.
Итак, когда страница загружается в первый раз, ваше выражение запускается, и каждый rank оценивается правильно.
Но когда вы вносите изменения в элемент, который уже отрендерен, ваш шаблон больше не будет визуализироваться , поэтому ваш ng-init не будет запущен.
Если вы хотите, чтобы ng-init был выполнен снова, вам необходимо удалить элемент из DOM и затем добавить его обратно в новую позицию.
Есть несколько альтернатив этому подходу, но я надеюсь, что это проясняет, что происходило.