javascript - 使用angularjs嵌套ng-repeat构造复杂表

标签 javascript angularjs

我在使用嵌套的 ng-repeat 制作正确的表格时遇到了问题。

我想要的是这个https://jsbin.com/razamagabo/1/edit?output

但我被困在这里https://plnkr.co/edit/d5voXIpzYL81sSl9BSY2?p=preview

我不介意我的标记不是表格,但我仍然坚持使用 div

<div class="row">
            <div class="col-xs-6" ng-repeat="obj in data">
                {{obj.date}}
                <div ng-repeat="user in obj.users">                 
                    <br>
                    {{user.name}}
                    <br>
                    {{user.mark}}
                </div>
            </div>
        </div>

最佳答案

为了能够以所需的方式显示数据,最简单的方法可能是在尝试呈现数据之前在 JS 中重组数据。

当用户名位于数据数组中的单独对象中时,尝试匹配用户名将非常复杂。

我建议在 Controller 中处理您的 scope.data。 (我假设您对接收数据的方式没有太多控制权)。

例如在你得到你的数据之后......

$scope.data = [
    {
        date:'1-1-2016',
        users:[
            {
                'name':'james',
                'mark':18
            },
            {
                'name':'alice',
                'mark':20
            }
        ]
    },
    {
        date:'2-1-2016',
        users:[
            {
                'name':'james',
                'mark':60
            },
            {
                'name':'alice',
                'mark':55
            }
        ]
    }
]

var userData = {};
var possibleDates = [];
for (dataObj of Object.entries($scope.data)) {
    for (userObj of dataObj) {
        if ( !userData[userObj.name] ) {
            userData[userObj.name] = {};
        }
        userData[userObj.name][dataObj.date] = userObj.mark;
        if (dates.indexOf(dataObj.date) < 0) {
            dates.push(dataObj.date);
        }
    }
}

$scope.users = userData;
$scope.dates = possibleDates;

这将在您的范围内为您提供一个这样的对象

$scope.users = {
    'james': {
        '1-1-2016': 18,
        '2-1-2016': 60
    },
    'alice': {
        '1-1-2016': 20,
        '2-1-2016': 55
    }
};

$scope.dates = ['1-1-2016', '2-1-2016'];

这对我来说似乎更容易构建您的模板。虽然这假设每个用户都有每个日期的条目。

<div>
    <div id='header-row'>
        <div id='empty-corner></div>
        <div class='date-header' ng-repeat='date in $scope.dates></div>
    </div>
    <div class='table-row' ng-repeat='{key, value} in $scope.users'>
        <div class='user-name'>{{ key }}</div>
        <div class='user-data' ng-repeat='date in $scope.dates>
            {{ value[date] }}
        </div>   
    </div>
</div>

只要您将 inline-block 样式应用于行/元素,这应该会为您提供所需的内容。

尽管您还可以考虑进一步简化数据的方法。您可以不让每个用户都有一个以日期为键的对象,您可以将值放入数组中。

关于javascript - 使用angularjs嵌套ng-repeat构造复杂表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41383220/

相关文章:

javascript - ng-click 后 Angular 不会重置表单?

javascript - AngularJS : Guidance to implement a factory, 服务、指令或其他

javascript - 在我的例子中,如何在函数内部调用函数本身

javascript - 如何在 View 中访问我的 C# 数组?

javascript - 当轮播中的图像为 1365 x 415 px 时,如何使轮播图像适合 1 7'' 或更多屏幕?

javascript - 我需要使用 underscore.js 旋转数组的矩阵元素。我有解决方案,但代码很大我想缩短它?

javascript - 添加动态 html 行后如何选择文本输入

javascript - 在 Angular 5 中使用 Stripe

javascript - 谷歌图表嵌入 API 不工作

java - Spring文件上传 - 得到预期的MultipartHttpServletRequest : is a MultipartResolver configured?错误