0

如您所知,在orderBytable 失去其排序并且$index值来自排序后的数组,而不是来自原始数组之后。因此,如果您将一个items数组传递['orange', 'banana','potato','apple']给您ng-repeat的 ,在orderByUI 上的 an 之后,您将看到它们如下所示:

- 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 之后获取显示数组的间隔索引的方法,有什么想法吗?

编辑:为了澄清,假设在 UI 上您已经排序items,然后选择苹果,然后选择橙色:

✓ apple
  banana
✓ orange
  potato

我想要一种方法来知道items 这两个 selected 之间的中间值,这样我就可以在我们的例子中选择所有中间值banana

4

3 回答 3

2

我认为解决这个问题的最简单方法是在控制器中预过滤数组并对该数组进行操作。

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

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

当然,在 View 中你会ng-repeatorderedItems没有过滤器的情况下结束:

<div ng-repeat="item in orderedItems">
  {{item}}
</div>
于 2015-01-27T14:39:51.290 回答
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 而不是 $index。

此方法适用于对象的集合。

请注意,此自定义过滤器应该是应用的所有过滤器列表中的第一个过滤器(orderBy 等),它会将附加属性索引(名称可自定义)添加到集合的每个对象中。

于 2015-01-27T10:58:46.347 回答
1

Angular 允许您在应用过滤器后为数据指定别名。您可以将该别名传递给从中选择项目的任何方法,以及项目或$index订购项目中项目的索引。

 <div ng-repeat="item in items | orderBy: '+' as orderedItems">
    <a ng-click="itemSelected(orderedItems, $index)">{{item}}</a>
 </div>
于 2017-11-15T18:33:02.613 回答