繁体   English   中英

Angular.js更复杂的条件循环

[英]Angular.js more complex conditional loops

目标是创造这个

<h3>11.4.2013</h3>
<ul>
 <li>entry 1</li>
 <li>entry 2</li> 
 <li>entry 3</li>
</ul>

<h3>10.4.2013</h3>
<ul>
 <li>entry 4</li>
 <li>entry 5</li> 
 <li>entry 6</li>
</ul>

由此

[
    {
        "name": "entry1",
        "date": "11.4.2013"
    },
    {
        "name": "entry2",
        "date": "11.4.2013"
    },
    {
        "name": "entry3",
        "date": "11.4.2013"
    },
    {
        "name": "entry4",
        "date": "10.4.2013"
    },
    {
        "name": "entry5",
        "date": "10.4.2013"
    },
    {
        "name": "entry6",
        "date": "10.4.2013"
    }
]

问题是ng-repeat必须在li所以我永远不能用ng-repeat做到这一点,是吗? 我发现这个来自Mark Rajnoc的http://jsfiddle.net/mrajcok/CvKNc/示例,但它仍然非常有限......

我还有其他选择吗? 写我自己的ng-repeat like指令? 或者还有其他方法可以不写一个吗?

您可以编写自己的过滤器,过滤掉外部ng-repeat的唯一日期,例如:

filter('unique',function(){
  return function(items,field){
    var ret = [], found={};
    for(var i in items){
      var item = items[i][field];
      if(!found[item]){
        found[item]=true;
        ret.push(items[i]);
      }
    }
    return ret;
  }
});

使用以下标记:

<div ng-repeat="dateItem in items | unique:'date' | orderBy:'date'">
<h3>{{dateItem.date}}</h3>
<ul>
  <li ng-repeat="item in items | filter:dateItem.date">
    {{item.name}}
  </li>
</ul>  
</div>

看一下这个工作的plnkr示例 - 或者这个更新的例子,添加项目

但是,如果您将拥有大量项目(数百或数千),则此解决方案不是最佳选择。 另一种方法是创建更优化的数据结构。 您甚至可以通过添加$ watch来使其与原始数据结构一起使用 - 例如:

$scope.$watch('items',function(){
  var itemDateMap = {};

  for(var i=0; i<$scope.items.length; i++){
    var item = $scope.items[i], key = item.date;
    if(!itemDateMap[key]){
      itemDateMap[key] = [];
    }
    itemDateMap[key].push(item);
  }

  $scope.itemDateMap=itemDateMap;


},true);

使用此标记:

<div ng-repeat="(date,subItems) in itemDateMap">
<h3>{{date}}</h3>
<ul>
  <li ng-repeat="item in subItems">
    {{item.name}}
  </li>
</ul>  
</div>

这是一个可以添加大量随机项的示例

当我和你的需求相同时,我使用了Object而不是Array。

<div ng-repeat="item in data">
  <h1>{{item.date}}</h1>
  <ul ng-repeat="name in item.names">
    <li>{{name}}</li>
  </ul>
</div>

http://jsfiddle.net/shoma/DqDsE/1/

这个问题页面可以帮到你。

AngularJS中范围原型/原型继承的细微差别是什么?

暂无
暂无

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

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