Angularjs неправильный индекс $после orderBy
Я новичок в угловой.js и есть некоторые проблемы с сортировкой моего массива и работой над этими отсортированными данными.
у меня есть список с элементами, и хочу, чтобы отсортировать ее по "магазине.storeName", который работает до сих пор. Но после сортировки данных моя функция удаления больше не работает. Я думаю, что это потому, что индекс $неправильный после сортировки, и поэтому неправильные данные удаляются.
Как я могу решить это? Упорядочение данных в области видимости, а не в представлении? Как это сделать это?
вот некоторые соответствующие код:
в виде:
<tr ng-repeat="item in items | orderBy:'Store.storeName'">
<td><input class="toggle" type="checkbox" ng-model="item.Completed"></td>
<td>{{item.Name}}</td>
<td>{{item.Quantity}} Stk.</td>
<td>{{item.Price || 0 | number:2}} €</td>
<td>{{item.Quantity*item.Price|| 0 | number:2}} €</td>
<td>{{item.Store.storeName}}</td>
<td><a><img src="img/delete.png" ng-click="removeItem($index)">{{$index}}</a></td>
</tr>
и в моем контроллере у меня есть эта функция удаления, которая должна удалить конкретные данные:
$scope.removeItem = function(index){
$scope.items.splice(index,1);
}
это прекрасно работает перед заказом в представлении.
Если чего-то важного не хватает, пожалуйста, позвольте мне сейчас.
спасибо!
6 ответов:
вместо этого или ретрансляции на
$index- который , как вы заметили, будет указывать на индекс в отсортированном / отфильтрованном массиве, вы можете передать сам элемент своему :<a><img src="img/delete.png" ng-click="removeItem(item)">{{$index}}</a>изменить
removeItemфункция для поиска индекса с помощьюindexOfметод массива следующим образом:$scope.removeItem = function(item){ $scope.items.splice($scope.items.indexOf(item),1); }
у меня была такая же проблема и другие ответы в этой теме не подходят для моей ситуации.
я решил свою проблему с пользовательским фильтром:
angular.module('utils', []).filter('index', function () { return function (array, index) { if (!index) index = 'index'; for (var i = 0; i < array.length; ++i) { array[i][index] = i; } return array; }; });который может быть использован таким образом:
<tr ng-repeat="item in items | index | orderBy:'Store.storeName'">и тогда в HTML вы можете использовать
item.indexвместо$index.этот метод подходит для коллекций объектов.
Пожалуйста, примите во внимание, что обычай этот фильтр должен быть первым в списке всех фильтров применяется (заказатьпо и т. д.) и это добавит дополнительное свойство
index(имя настраивается) в каждый объект коллекции.
Я начал изучать angular и столкнулся с подобной проблемой, и, основываясь на ответе @pkozlowski-opensource, я решил ее просто с чем-то вроде
<a> <img src="img/delete.png" ng-click="removeItem(items.indexOf(item))"> {{items.indexOf(item)}} </a>
попробуйте это:
$scope.remove = function(subtask) { var idx = $scope.subtasks.indexOf(subtask), st = $scope.currentTask.subtasks[idx]; // remove from DB SubTask.remove({'subtaskId': subtask.id}); // remove from local array $scope.subtasks.splice(idx,1); }вы можете найти подробное объяснение запись в моем блоге.
Я бы просто оставил комментарий, но у меня нет "репутации".
решение мили-это именно то, что мне тоже нужно. Чтобы ответить pkozlowski.вопрос открытым: когда у вас есть вложенные
ngRepeats, динамический список (например, где вы разрешаете удаление), или оба (что в моем случае), используя$indexне работает, потому что это будет неправильный индекс для данных после сортировки и с помощьюngInitчтобы кэшировать значение не работает либо потому, что он не переоценивается, когда список изменений.обратите внимание, что решение mile позволяет настроить имя присоединенного свойства индекса, передав параметр
<tr ng-repeat="item in items | index:'originalPosition' | orderBy:'Store.storeName'">моя измененная версия:
.filter( 'repeatIndex', function repeatIndex() { // This filter must be called AFTER 'filter'ing // and BEFORE 'orderBy' to be useful. return( function( array, index_name ) { index_name = index_name || 'index'; array.forEach( function( each, i ) {each[ index_name ] = i;}); return( array ); }); })
в случае, если кто-то должен использовать
$index, вы можете дать имя отсортированному / отфильтрованному массиву:<tr ng-repeat="item in sortedItems = (items | orderBy:'Store.storeName') track by $index">смотрите мой ответ здесь.
Comments