Как добавить элементы во вложенный список 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({});
};
Другие вопросы по тегам