【发布时间】:2018-08-06 12:10:46
【问题描述】:
这就是问题所在。该代码以多维数组格式从 Web 服务接收数据。行数和列数以及这些列的名称(键)在运行时之前也是未知的。我需要以类似表格的结构显示该数据的网格。我们想使用 CSS Grid(没有表格)来显示这些数据。
例如,假设以下数据是从 Web 服务中检索到的。
var data = [
{ id: 1, first: 'John', last: 'Doe' },
{ id: 2, first: 'Jane', last: 'Davis' },
{ id: 3, first: 'Steve', last: 'Smith' }
];
vm.data = data;
现在,我需要以 CSS 网格格式显示它。首先,我定义样式中包含“display: grid”的包含 DIV,这样我们就有了一个 CSS Grid。
<div style="display: grid;">...</div>
所需的 HTML 需要类似于以下内容。 (请注意,DIV 的实际顺序对我来说无关紧要,只要 grid-row 和 grid-column 值正确即可)。
<div style="display: grid;">
<div style="grid-row: 1; grid-column: 1;">id</div>
<div style="grid-row: 1; grid-column: 2;">first</div>
<div style="grid-row: 1; grid-column: 3;">last</div>
<div style="grid-row: 2; grid-column: 1;">1</div>
<div style="grid-row: 2; grid-column: 2;">John</div>
<div style="grid-row: 2; grid-column: 3;">Doe</div>
<div style="grid-row: 3; grid-column: 1;">2</div>
<div style="grid-row: 3; grid-column: 2;">John</div>
<div style="grid-row: 3; grid-column: 3;">Doe</div>
<div style="grid-row: 4; grid-column: 1;">3</div>
<div style="grid-row: 4; grid-column: 2;">John</div>
<div style="grid-row: 4; grid-column: 3;">Doe</div>
</div>
该网站使用 AngularJS,因此一种选择是使用 ng-repeat 来生成 HTML。问题是,ng-repeat 真的是用来处理一维数据的。但是,我们可以使用 $index (例如)提取一些额外的数据。
例如,为了生成 DIV 来呈现列标题(在这种情况下,我们将使用键名)我可以这样做:
HTML:
<div style="display: grid; grid-template-columns: repeat({{ vm.reportHeaders.length }}, 1fr); grid-gap: 10px;">
<div ng-repeat="(key, value) in reportingCtrl.data[0]" style="grid-column: {{ $index }}; grid-row: 1;">{{ key }}
</div>
</div>
后面的代码:
var reportHeaders = [];
for (var property in data[0]) {
if (data[0].hasOwnProperty(property)) {
reportHeaders.push(property);
}
}
vm.reportHeaders = reportHeaders;
到目前为止一切顺利,但现在我们来看看数据,这就是我卡住的地方。
在我看来,我需要:
- 逐行遍历数据以访问行索引
- 逐行逐列循环,以获得正确的列索引和要显示的数据
- 生成一个 DIV 标记,在“grid-column”和“grid-row”样式属性中呈现正确的行/列数据,以及行/列的正确数据。
我不知道该怎么做。
想法
- 我看到了对 ng-repeat-start/end 的引用,这在这里可能会有所帮助,但这似乎仍然无法解决不知道涉及多少列的问题?
- 我可以将表标题数据添加到代码隐藏中的数据表中,如果这样可以让生活更轻松吗?
- 也许有一种方法可以在 ng-repeat 中创建计数器,而不是使用 $index?
- 我可以在代码隐藏中生成 HTML,然后将其显示或添加到 DOM,但这不是我的首选。
- 我对想法持开放态度?也许我离树太近了,看不到森林?
【问题讨论】:
标签: css angularjs angularjs-ng-repeat css-grid