Как добавить элементы во вложенный список angular-ui-tree после переупорядочения?
У меня есть вложенный список предметов, что-то вроде Day > Exercises > Sets
,
каждый day
может иметь много exercises
и каждый exercise
может иметь много sets
,
Для каждого списка есть add
кнопка.
Все прекрасно работает, пока вы не измените их порядок с помощью angular-ui-tree.
Если вы поменяете первое упражнение со вторым, а затем нажмите на + set
кнопка, новая заданная позиция это не правильная.
Вот кодекс
Попробуйте поменять 2 упражнения одного дня и затем нажмите на + set
это принадлежит каждому из упражнений.
Я знаю, что проблема вызвана переменными, установленными в ng-init
директива, но я не могу найти никакого решения.
Спасибо.
<ul ng-model="program.days" ui-tree-nodes>
<li ng-repeat="day in program.days" ng-init="dayIndex = $index" ui-tree-node>
<div class="day">{{ day.name }}</div>
<!-- Exercises -->
<ul ng-model="day.exercises" ui-tree-nodes>
<li ng-repeat="ex in day.exercises" ng-init="exIndex = $index" ui-tree-node>
<div>{{ ex.name }}</div>
<!-- Sets -->
<ul ng-model="ex.sets" ui-tree-nodes>
<li ng-repeat="set in ex.sets" ui-tree-node>
<div>{{ set.reps }} reps</div>
</li>
<li><button ng-click="addSet(dayIndex, exIndex)">+ set</button></li>
</ul>
<!-- end Sets -->
</li>
<li><button ng-click="addExercise(dayIndex)">+ exercise</button></li>
</ul>
<!-- end Exercises -->
</li>
<li><button ng-click="addDay()">+ day</button></li>
</ul>
<!-- end Days -->
1 ответ
Ng-init не хорош для того, что вы делаете. При работе с вложенными массивами старайтесь передавать объект, а не индекс, чтобы ваш код оставался чистым.
Это пример:
<ul>
<li ng-repeat="day in program.days">
<div class="day">{{ day.name }}</div>
<ul>
<li ng-repeat="ex in day.exercises">
<div class="ex">{{ ex.name }}</div>
</li>
</ul>
</li>
<li><button ng-click="addExercice(day)">+ set</button></li>
</ul>
При этом вы передаете свой "дневной" объект в вашу функцию, поэтому любое изменение в этом объекте будет отражать ваш HTML:
$scope.addExercice = function(day) {
day.exercices.push({});
};