it-swarm.com.ru

$ index объекта в массиве при использовании ng-repeat и фильтра

Я довольно новичок в angular и ​​смог немного обойти. Но я не могу найти ответ на этот сценарий ...

У меня есть множество объектов, которые я собираю из базы огня. Я использую ng-repeat для объектов, затем отображаю данные соответственно. Я пытаюсь передать индекс в качестве параметра маршрута к контроллеру редактирования. В этом случае я хотел бы получить данные объекта, как можно было бы ожидать. Однако, когда я фильтрую ng-repeat, я получаю индекс отфильтрованного контента. где я ошибаюсь в поиске истинного индекса?

  .config(['$routeProvider', '$locationProvider', function($routeProvider, $locationProvider) {
$routeProvider
  .when('/profiles/:index', {
    templateUrl: '../views/profile.html',
    controller: 'profileCtrl'
  });

Маршрут вверху, Контроллер внизу

  .controller('profileCtrl', function( $scope, $routeParams ){

$scope.teamProfile = $scope.ourTeam[$routeParams.index];
    $scope.index = $routeParams.index;
});

И, наконец, фрагмент html из повторения.

<div class="profileName"><a href="/profiles/{{$index}}">{{member.name}}</a><span class="handle">{{member.handle}}</span></div>
15
lutonmedia

К сожалению $index это только "смещение итератора повторяющегося элемента (0..length-1)"

Если вы хотите исходный индекс, вам нужно добавить его в свою коллекцию перед фильтрацией или просто не фильтровать элементы вообще.

Один из возможных подходов:

angular.forEach(members, function(member, index){
   //Just add the index to your item
   member.index = index;
});

<div ng-repeat="member in members">
   <a href="/profiles/{{member.index}}">
</div>

Теперь также кажется, что такая информация действительно больше похожа на идентификатор, чем на что-либо еще. Надеюсь, что это уже часть записи, и вы можете привязаться к ней вместо использования индекса.

11
Josh

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

<div ng-repeat="member in members">
{{members.indexOf(member)}}
</div>

indexOf всегда возвращает исходный индекс в ng-repeat

Демо

33
Manas

Вы можете использовать функцию для возврата индекса из массива

<div ng-repeat="post in posts | orderBy: '-upvotes'">
   <a href="#/posts/{{getPostIndex(post)}}"></a> 
</div>

И функция

$scope.getPostIndex = function (post) {
    return $scope.posts.indexOf(post); //this will return the index from the array
}

В моем примере у меня есть массив объектов с именем «posts», в котором я использую фильтр, чтобы упорядочить их по одному из их свойств (свойство «upvotes»). Затем в атрибуте "href" я вызываю функцию "getPostIndex", передавая по ссылке , текущий объект.

Функция getPostIndex () просто возвращает индекс из массива с помощью метода indexOf () массива Javascript. 

Приятно то, что это решение не привязано к конкретному фильтру (как в ответе @holographix) и будет работать для всех них.

6
watsabitz

Я просто наткнулся на ту же проблему, и я нашел этот супер-трюк в agular git.

items.length - $index - 1

лайк

    <div ng-repeat="item in ['item', 'item', 'item'] | reversed">
      <!-- Original index: 2, New index: 0 -->
      <p>Original index: {{items.length - $index - 1}}, New index: {{$index}}</p>
      <!-- Original index: 1, New index: 1 -->
      <p>Original index: {{items.length - $index - 1}}, New index: {{$index}}</p>
      <!-- Original index: 0, New index: 2 -->
      <p>Original index: {{items.length - $index - 1}}, New index: {{$index}}</p>
    </div>

если вы в беде, как я, попробуйте

https://github.com/angular/angular.js/issues/4268

3
holographix

Вы можете ввести $route и использовать $route.current.params.index, чтобы получить значение.

.controller('profileCtrl', function( $scope, $route ) {

     $scope.index = $route.current.params.index;

});
0
Awakening