AngularJS отслеживает по выражению для списков, которые могут добавлять и удалять элементы

#angularjs #angularjs-ng-repeat

#angularjs #angularjs-ng-repeat

Вопрос:

Есть ли хороший способ использовать эту track by функцию для ng-repeat редактируемых списков, то есть списков, в которые пользователь может удалять и добавлять элементы?

Существующим объектам уже присвоен уникальный идентификатор, в то время как отсутствующий идентификатор является моим маркером для создания этого элемента при отправке формы.

Использование track by $index будет работать до тех пор, пока пользователь добавляет только элементы в список. Использование track by myId будет работать до тех пор, пока пользователь удаляет или изменяет только элементы в списке.

Единственный способ, который я вижу, чтобы реализовать это поведение, — это присвоить временный случайный идентификатор свойству каждого нового элемента и иметь метод scope, который возвращает либо реальный, либо временный идентификатор, независимо от того, что существует. Кажется не таким элегантным…

Насколько я могу себе представить, это довольно распространенный вариант использования, существуют ли более элегантные способы справиться с этим?

Комментарии:

1. Почему бы не добавить свойство в вашу модель: isNew, IsDeleted, IsModified?

2. @hoeni: В аналогичной ситуации я использовал подход, заключающийся в определении временных идентификаторов (отрицательных значений), которые обновляются после сохранения элемента на стороне сервера и присвоения реального (положительного) идентификатора.

Ответ №1:

Я часто добавляю свойство cid (client-id) в свои модели. Я назначаю свойство, когда извлекаю модели или создаю новую, чтобы каждая модель имела cid . Тогда я могу сделать что-то вроде:

 <ul>
<li ng-repeat="for item in list track by item.cid">{{ item.name }}</li>
</ul>
  

Ответ №2:

Попробуйте это:

 item in items track by $id(item)