#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)