【问题标题】:how can I avoid multiple tbody when using multiple ngrepeat in table在表中使用多个 ngrepeat 时如何避免多个 tbody
【发布时间】:2014-05-20 12:27:14
【问题描述】:

演示:http://jsfiddle.net/6dJ79/1/

上面的演示有效,但是它通过重复 tbody 来实现结果。我想避免这种情况。

有没有其他方法可以为每种颜色、每个人设置一行而不重复 tbody?理想情况下,我希望在不操作数据的情况下使输出如下所示。

<table>
    <thead>
        <tr>
            <th>Name</th>
            <th>Color</th>
            <th>Fav</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>Bill</td>
            <td>red</td>
            <td>yes</td>
        </tr>
        <tr>
            <td>Bill</td>
            <td>blue</td>
            <td>no</td>
        </tr>
        <tr>
            <td>Larry</td>
            <td>purple</td>
            <td>yes</td>
        </tr>
        <tr>
            <td>Larry</td>
            <td>yellow</td>
            <td>no</td>
        </tr>
    </tbody>
</table>

数据:

{
    name: 'Bill',
    colors: [{
        name: 'red',
        favColor: 'yes'
    }, {
        name: 'blue',
        favColor: 'no'
    }]
}, {
    name: 'Larry',
    colors: [{
        name: 'purple',
        favColor: 'yes'
    }, {
        name: 'yellow',
        favColor: 'no'
    }]
}

【问题讨论】:

  • 因为你坚持使用&lt;table&gt;,你唯一真正的选择是扁平化你的数据,或者使用ng-repeat-startng-repeat-end解开HTML中的内部集合。但在这种情况下,这意味着所有people 必须具有相同的colours(但答案当然不同)。

标签: javascript html angularjs angularjs-ng-repeat ng-repeat


【解决方案1】:

我会在你的作用域上创建一个函数,它会使用嵌套循环将你的嵌套对象扁平化为一个简单的扁平数组。

这是一个有效的fiddle 范围方法:

$scope.peopleColors = function () {
    var pc = [];
    for (var i = 0, plen = $scope.people.length; i < plen; i++) {
        var person = $scope.people[i];
        for (var j = 0, clen = person.colors.length; j < clen; j++) {
            var color = person.colors[j];
            pc.push({
                name: person.name,
                color: color.name,
                favColor: color.favColor
            });
        }
    }
    return pc;
};

标记:

<tr ng-repeat="pc in peopleColors()">

编辑:我更新了fiddle 以显示新人的动态添加

【讨论】:

  • 这是一个很好的解决方案,但受到 infdig 问题的困扰。 var pc 需要在 peopleColors() 之外初始化和创建以避免 infdig。理想情况下,虽然我更喜欢它作为过滤器,但我不确定我们是否可以解决 infdig 问题作为过滤器。 docs.angularjs.org/error/$rootScope/infdig
【解决方案2】:

Here is an implementation 使用过滤器。

myApp.filter('denormalize', function(){
    return function(people) {
        var arr = [];
        angular.forEach(people, function(person){
            angular.forEach(person.colors, function(color){
                arr.push({
                    name: person.name, 
                    color: color.name, 
                    fav: color.favColor
                });
            });
        });

        return arr;
    }
});

在html中:

<tbody>
    <tr ng-repeat="person in people | denormalize">
        <td>{{ person.name }}</td>
        <td>{{ person.color }}</td>
        <td>{{ person.fav }}</td>
    </tr>
</tbody>

【讨论】:

  • 这和 Brocco 的回答似乎都有 infdig 问题; docs.angularjs.org/error/$rootScope/infdig 当它作为控制器时,我可以通过一次填充数组来绕过它,但是我们如何使用过滤器来实现呢?
猜你喜欢
  • 2013-02-06
  • 2020-06-11
  • 2017-10-15
  • 2014-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多