繁体   English   中英

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

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

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

我有要显示的数据:

$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不可用,它将无法工作。

是否存在我没​​有想到的显示逻辑的排列? 或者是否有“正确”的方法来测试元素是否是列表中显示的最后一个(或第一个)?

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

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

如果按available filter ,那么简单的$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 doc示例的一个分支

暂无
暂无

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

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