简体   繁体   English

使用 ng-repeat 和过滤器时数组中对象的 $index

[英]$index of Object in Array while using ng-repeat and a filter

Im fairly new to angular and have been able to get around somewhat.我对 angular 还很陌生,并且已经能够有所了解。 But I cant seem to find the answer to this scenario...但我似乎无法找到这种情况的答案......

I have an array of objects, which I am pulling down from firebase.我有一组对象,我正在从 firebase 中拉下它们。 I am using an ng-repeat for the objects, then displaying data accordingly.我对对象使用 ng-repeat,然后相应地显示数据。 I am trying to pass the index as a routeparam to an "edit" controller.我试图将索引作为路由参数传递给“编辑”控制器。 In which case I would like to pull the object data as one would anticipate.在这种情况下,我想按照预期提取对象数据。 However, when I filter the ng-repeat I am getting the index of the filtered content.但是,当我过滤 ng-repeat 时,我得到了过滤内容的索引。 where am I going wrong in finding the true index?我在寻找真正的索引时哪里出错了?

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

Route is above, Controller is below路由在上面,控制器在下面

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

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

And finally the snippet of html from within the repeat.最后是重复中的 html 片段。

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

Try this :试试这个:

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

indexOf always returns the original index in an ng-repeat indexOf 总是在 ng-repeat 中返回原始索引

Demo演示

Unfortunately $index is only the "iterator offset of the repeated element (0..length-1)"不幸的是$index只是“重复元素的迭代器偏移量(0..length-1)”

If you want the original index you would have to add that to your collection before filtering, or simply not filter the elements at all.如果您想要原始索引,则必须在过滤之前将其添加到您的集合中,或者根本不过滤元素。

One possible approach:一种可能的方法:

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>

Now, it also seems that this kind of information is really more like an ID than anything else.现在看来,这种信息真的更像是一个ID而不是其他任何东西。 Hopefully that is already part of the record, and you can bind to that instead of using the index.希望这已经是记录的一部分,您可以绑定到它而不是使用索引。

You could use a function to return the index from the array您可以使用函数从数组中返回索引

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

And the function和功能

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

On my example I have an array of objects called "posts", on which I use a filter to order them by one of their properties ("upvotes" property).在我的示例中,我有一个名为“posts”的对象数组,我使用过滤器按它们的一个属性(“upvotes”属性)对它们进行排序。 Then, in the "href" attribute I call "getPostIndex" function by passing it by reference , the current object.然后,在“href”属性中,我通过引用传递它调用“getPostIndex”函数,即当前对象。

The getPostIndex() function simply returns the index from the array by using Javascript array indexOf() method. getPostIndex() 函数通过使用 Javascript 数组 indexOf() 方法简单地从数组中返回索引。

The nice thing about this is that this solution is not tied to a specific filter (like in @holographix answer) and will work for all of them.这样做的好处是,此解决方案不依赖于特定的过滤器(如@holographix 的答案),并且适用于所有过滤器。

I just stumbled across the same problem and I found this supertrick on the angular git issues我只是偶然发现了同样的问题,我在 angular git 问题上发现了这个超级技巧

items.length - $index - 1

like喜欢

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

if you're in trouble like me give it a shot:如果你像我一样遇到麻烦,试一试:

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

You can inject $route and use $route.current.params.index to get the value.您可以注入$route并使用$route.current.params.index来获取值。

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

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

});

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM