Ng-Repeat,如何测试最后一个 ng-show 元素

Ng-Repeat, how to test for last ng-show element

我不是要为 ng-repeat 的最后一个元素添加不同的 class。

我有数据要显示:

$scope.sizes = [{name:XS,available:true},{name:S,available:true},{name:M,available:false},{name:L,available:true},{name:XL,available:false}];

我想显示包含 true 的数据范围,即将上面显示为 "XS → L"(注意遗漏了 M 选项)。

我想到的最好的方法是使用 ng-repeat:

<span ng-repeat="size in sizes track by $index"
                      ng-init="sizeIndex = $index"
                      ng-show="size.available == true && (sizeIndex == 0  || sizeIndex == (sizes.length -1))">
                    {{size.short}}<span ng-show="sizeIndex ==0"> → </span>
                </span>

正如预期的那样,这失败了,因为 XL 码可用 == false,如果 XS 码不可用,它将不起作用。

有没有我没有想到的显示逻辑排列?或者是否有 'proper' 方法来测试一个元素是否是列表中最后(或第一个)显示

执行此操作的最佳方法是在尝试显示之前在控制器中计算结果:

$scope.sizes = [
    {name: "XS", available: true},
    {name: "S", available: true},
    {name: "M", available: false},
    {name: "L", available: true},
    {name: "XL", available: false}
];

DisplayRange();

function DisplayRange () {
    var BeginSize = null, EndSize = null;
    for (var i=0; i < $scope.sizes.length; i++) {
        if ($scope.sizes[i].available === true && BeginSize == null) {
            BeginSize = $scope.sizes[i].name;
        }
        if ($scope.sizes[i].available === true) {
            EndSize = $scope.sizes[i].name;
        }
    }
    $scope.FormattedSizes = BeginSize + " → " + EndSize;
}

这是在扫描 $scope.sizes 数组中的每个项目。当它找到第一个可用项目时,它会将那个名称分配给 BeginSize。每次它看到可用的项目时,它都会将该名称分配给 EndSize。我们可以草率地使用 EndSize,因为最终循环将到达最后一个可用项目并将其分配给 EndSize,这将使它正确。

在你的 HTML 中,像这样引用它:

<span>{{ FormattedSizes }}</span>

如果你 filter 通过 available 那么一个简单的 $first n $last 就可以了

  <li class="animate-repeat" ng-repeat="size in sizes | filter: {available:true}">
   <div ng-show="$first">{{size.name}}</div>
    <div ng-show="$last">{{size.name}}</div>
  </li>

演示 https://plnkr.co/edit/QHIKrUOudSYpczWuVdCe?p=preview 这是 angular 文档示例的一个分支