2015-01-27 2 views
0

Как вы знаете, после orderBy таблица теряет свой порядок, а значение $index - это отсортированный массив, а не исходный массив. Так что если вы передаете items массив ['orange', 'banana','potato','apple'] к вашему ng-repeat, после orderBy на пользовательском интерфейсе вы увидите их, как это:Угловые промежуточные индексы после orderBy

- apple $index = 0 
- banana $index = 1 
- orange $index = 2 
- potato $index = 3 

И если вы сейчас хотите мульти выбора элементов между apple($index = 0) и orange($index = 2) вы могли бы подумать, что это будет работать:

for(index = 0; index <= 2; index++) 
    console.log(items[index]) 

, что неправильно, он будет печатать: [orange, banana, potato]; не [apple, banana, orange].

Я ищу способ получить интервальные индексы отображаемого массива после orderBy, любые идеи?

EDIT: Для уточнения, предположит, что на пользовательском интерфейсе вы отсортировали items, а затем выбрать яблоко, а затем выберите оранжевый цвет:

✓ apple 
    banana 
✓ orange 
    potato 

Я хочу способ узнать itemsмежду этими двумя выбранными, так что я могу выбрать все между ними, в нашем случае banana.

+0

Вы можете просто использовать элемент вместо $ index и получить исходный индекс, используя $ scope.items.indexOf (item). для рабочего примера вы можете перейти по следующей ссылке. http: // jsfiddle.net/0uksemjs/ – chandings

+0

Когда вы используете фильтр в представлении, он предназначен для форматирования/изменения данных для целей презентации. Можете ли вы уточнить, почему нужно индексы фильтрованного/упорядоченного массива? И если это больше, чем для презентационных целей, тогда вы должны создать упорядоченную копию массива в контроллере с помощью '$ filter (" orderBy ")' –

+0

@NewDev Мне нужны индексы, потому что я хочу, чтобы несколько элементов выбирали в представлении , поэтому, если я выберу яблоко, а затем сдвиг выберите оранжевый, я хочу, чтобы оранжевый выбирался автоматически, независимо от 'orderBy' – anvarik

ответ

1

Это может быть достигнуть с помощью пользовательского фильтра https://stackoverflow.com/a/22978169/1632286

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

HTML:

<tr ng-repeat="item in items | index | orderBy:'Store.storeName'"> 

, а затем в HTML вы можете использовать item.index вместо $ индекса.

Этот метод подходит для коллекций объектов.

Пожалуйста, примите во внимание, что этот настраиваемый фильтр должен быть первым в списке всех примененных фильтров (orderBy и т. Д.), И он добавит дополнительный индекс свойств (имя настраивается) в каждый объект коллекция.

+0

Добавление фильтра в 'index' не решает мою проблему, так как оно не отличается от' items.indexOf ('apple') ', которое является' 3' и 'items.indexOf ('orange')', которое равно 0. Что Я хочу получить индексы UI, 0 и 2, чтобы я мог получить доступ к 1 банану. – anvarik

2

Я думаю, что самый простой способ приблизиться к этому - предварительно фильтровать массив в контроллере и работать с этим массивом.

$scope.orderedItems = $filter("orderBy")($scope.Items, "+"); 

$scope.multiSelect = function(minIdx, maxIdx){ 
    //... 
    $scope.selectedItems = $scope.orderedItems.slice(minIdx, maxIdx); 
} 

Конечно, в представлении вы ng-repeat над orderedItems без фильтра:

<div ng-repeat="item in orderedItems"> 
    {{item}} 
</div> 
0

Угловая позволяет указать псевдоним для данных после того, как были применены фильтры. Вы можете передать этот псевдоним в любой метод, который выбирает элементы из него вместе с элементом или $index, который является индексом элемента в упорядоченных элементах.

<div ng-repeat="item in items | orderBy: '+' as orderedItems"> 
    <a ng-click="itemSelected(orderedItems, $index)">{{item}}</a> 
</div> 
Смежные вопросы