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);
}


это прекрасно работает перед заказом в представлении.
Если чего-то важного не хватает, пожалуйста, позвольте мне сейчас.



спасибо!

569   6  

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

    Ничего не найдено.