我有点惊讶于这么多人支持使用自定义指令和创建由$watch更新的代理变量。
正是出于这样的问题,AngularJS过滤器才应运而生!
文档中说:
A filter formats the value of an expression for display to the user.
我们并不打算操纵数据,只是为了以一种不同的方式显示它而进行格式化。因此,让我们创建一个过滤器,该过滤器接收我们的行数组,将其展平,并返回展平后的行。
.filter('flattenRows', function(){
return function(rows) {
var flatten = [];
angular.forEach(rows, function(row){
subrows = row.subrows;
flatten.push(row);
if(subrows){
angular.forEach(subrows, function(subrow){
flatten.push( angular.extend(subrow, {subrow: true}) );
});
}
});
return flatten;
}
})
现在我们需要将过滤器添加到ngRepeat中:
<table class="table table-striped table-hover table-bordered">
<thead>
<tr>
<th>Rows with filter</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="row in rows | flattenRows">
<td>{{row.name}}</td>
</tr>
</tbody>
</table>
如果需要,现在可以将您的表格与其他筛选器结合使用,例如搜索。
虽然多个tbody的方法很方便,也是有效的,但它会破坏任何依赖子行顺序或索引的CSS,例如“条纹”表,并假定您未对tbody进行样式设置,以便不要重复。
这里有一个plunk:http://embed.plnkr.co/otjeQv7z0rifPusneJ0F/preview
编辑:我添加了一个subrow值,并在表格中使用它来显示哪些行是子行,因为您提到了这个问题。