【问题标题】:angularjs - how to get in the controller the index of an item in a ng-repeat filter based on the value of one of its properties?angularjs - 如何根据其中一个属性的值在控制器中获取 ng-repeat 过滤器中项目的索引?
【发布时间】:2014-04-16 22:08:33
【问题描述】:

我在我的 html 文件中使用 ng-repeat 来显示过滤后的项目:

<li ng-repeat="item in (filteredItems = (items | filter:query))">
  {{ item.name }}
</a>

在控制器中,我想根据他的一个属性获取项目的索引。

精度:我希望在过滤后的列表中获得索引,而不是在整个列表中。

例如,这里的项目女巫名称的索引是some_item_7

var app = angular.module('myApp', []);

app.controller('MyCtrl', ['$scope',
  function MyCtrl($scope) {

    $scope.query = 'some';

    $scope.items = 
    [
      { name: 'some_item_1' },
      { name: 'another_item_2' },
      { name: 'some_item_3' },
      { name: 'another_item_4' },
      { name: 'some_item_5' },
      { name: 'another_item_6' },
      { name: 'some_item_7' },
      { name: 'another_item_8' },
      { name: 'some_item_9' }
    ];

    $scope.itemNext = function (item) {
      console.log(item.name);
    };

    $scope.getIndexFromName = function (name) {
      console.log("trying to get the index of the item with name = " + name);
    }

    $scope.getIndexFromName('some_item_7');

  }
]);

http://plnkr.co/edit/C8gL9qV1MyonTwDENO9L?p=preview

有什么想法吗?

【问题讨论】:

  • 用代码更新答案以初始化过滤后的数组,以及一个新的 plunker 演示。 plnkr.co/NSvBz1yWvmeFgXITutZF
  • 非常感谢@j.wittwer!!

标签: angularjs angularjs-ng-repeat angularjs-controller


【解决方案1】:

您的 ng-repeat 表达式会在您的范围内创建过滤列表数组。
&lt;li ng-repeat="item in (filteredItems = (items | filter:query))"&gt;

您可以像任何数组一样遍历它,检查与 name 参数匹配的项目。 $scope.filteredItems

这是一个演示:http://plnkr.co/69nnbaZaulgX0odG7g7Y

查看此相关帖子:AngularJS - how to get an ngRepeat filtered result reference

更新
您的 cmets 表明您不想等待 ng-repeat 创建过滤项目的数组。您可以使用$filter 服务在页面加载之前轻松初始化相同的数组。使用:

$scope.filteredItems = $filter('filter')($scope.items, {name: $scope.query}, false)

这样做不会干扰ng-repeat 在 DOM 创建期间将其过滤结果保存到同一 filteredItems 数组。

这是一个更新的(和互动的)demo:http://plnkr.co/NSvBz1yWvmeFgXITutZF

【讨论】:

  • 感谢您的快速回答,但 $scope.filteredItems 实际上在 getIndexFromName() 函数中未定义。 Plunker 更新:plnkr.co/edit/C8gL9qV1MyonTwDENO9L?p=preview
  • 这是因为您调用控制器中的 getIndexFromName 函数的时间。它发生在过滤操作创建filteredItems数组之前。
  • 谢谢,但如果我想通过调用getIndexFromName() 函数来初始化应用程序怎么办?没有强制用户点击按钮的方法吗?也许是一种等到filteredItems 数组完成的方法?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-30
  • 2020-03-03
  • 1970-01-01
  • 2014-04-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多