我有点惊讶,这么多人提倡自定义指令并创建由 $watch 更新的代理变量。
像这样的问题是 AngularJS 过滤器被制造出来的原因!
从文档:
A filter formats the value of an expression for display to the user.
我们不打算操纵数据,只是将其格式化以便以不同的方式显示。因此,让我们创建一个过滤器,接收我们的 rows 数组,将其展平,然后返回展平后的行。
.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 中设置样式不想重复的方式。
这是一个小插曲:http: //embed.plnkr.co/otjeQv7z0rifPusneJ0F/preview
编辑:我添加了一个子行值并在表中使用它来显示哪些行是子行,因为您表示担心能够做到这一点。