Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Angular.js更复杂的条件循环_Javascript_Loops_Angularjs_Angularjs Ng Repeat - Fatal编程技术网

Javascript Angular.js更复杂的条件循环

Javascript Angular.js更复杂的条件循环,javascript,loops,angularjs,angularjs-ng-repeat,Javascript,Loops,Angularjs,Angularjs Ng Repeat,我们的目标是创建这个 <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<

我们的目标是创建这个

<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>
问题是ng repeat必须在
li
上,所以我永远无法使用ng repeat来实现这一点,对吗?我从Mark Rajnoc那里找到了这个例子,但它仍然非常有限


我还有什么选择?写我自己的ng重复指令?或者有没有其他不写的方法呢?

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

过滤器('unique',函数(){
返回函数(项目、字段){
var ret=[],found={};
对于(项目中的var i){
var项目=项目[i][field];
如果(!找到[项目]){
找到[项目]=真;
重新推送(项目[i]);
}
}
返回ret;
}
});
使用以下标记:


{{dateItem.date}
  • {{item.name}
看看——或者这个

然而,如果你有很多物品(成百上千),这个解决方案不是最理想的。另一种方法是创建更优化的数据结构。您甚至可以通过添加$watch使其与原始数据结构配合使用,例如:

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

对于(var i=0;i当我有与您相同的需求时,我使用对象而不是数组

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

{{item.date}
  • {{name}}

这个问题页会帮助你


让我们从另一个角度来看这个问题。如果你不使用Angular,你会怎么做?是否可以在不转换数据的情况下以你想要的方式显示它?如果我不使用Angular,我会这样做或类似的方式等等,因为什么时候你可以使用ng repeat作为一个元素?无论如何,这在性能方面是如何的?转换不是更好像这样管理init上的数据结构?还有一件很重要的事情是,我将在运行中编辑和添加新条目..添加肯定有效我仍然有点担心性能..抱歉,你不能使用ng repeat作为元素。但是你可以将它用于任何元素,所以它都有效-但这是一个糟糕的例子。我有将其设置为div。从性能角度看,您应该可以,除非您有一个非常大的集合。如果您不介意一个新的数据结构,您可以在init函数中进行转换。但使用我的方法,您不必这样做,并且可以轻松地向原始集合添加更多项-。Ha:)嗯,可能会有多达..400个条目..每个条目上都会有额外的过滤器..而且那个日期也有时间,所以我不能轻易地过滤条目..我只接受你的答案,这对我没有什么帮助,但可能是我问的正确答案。问题是你a)无法对对象进行排序b)无法轻松地将()推入其中。除此之外,它与我在这里描述的转换类似,但不确定在编辑或添加新项时是否能正常工作(无需再次重建整个数组/对象)。。
<div ng-repeat="item in data">
  <h1>{{item.date}}</h1>
  <ul ng-repeat="name in item.names">
    <li>{{name}}</li>
  </ul>
</div>