繁体   English   中英

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

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

我对 angular 还很陌生,并且已经能够有所了解。 但我似乎无法找到这种情况的答案......

我有一组对象,我正在从 firebase 中拉下它们。 我对对象使用 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>

试试这个:

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

indexOf 总是在 ng-repeat 中返回原始索引

演示

不幸的是$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>

现在看来,这种信息真的更像是一个ID而不是其他任何东西。 希望这已经是记录的一部分,您可以绑定到它而不是使用索引。

您可以使用函数从数组中返回索引

<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() 函数通过使用 Javascript 数组 indexOf() 方法简单地从数组中返回索引。

这样做的好处是,此解决方案不依赖于特定的过滤器(如@holographix 的答案),并且适用于所有过滤器。

我只是偶然发现了同样的问题,我在 angular 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

您可以注入$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