使用 HTML/angular2 模板引擎在 angular2 中进行动态数据可视化
Dynamic data visualization in angular2 using HTML/angular2 template engine
在前端处理数据时,通常很难将数据可视化以供用户理解。要可视化的(动态)数据结构良好且简单(重点关注数据大小和防止过载)。
但下面的数据结构 (DATA
) 当然不是用户的最佳视觉表示。
让我用下面的例子解释一下我还不能很好解决的问题:
这里我要指出的是,我是从EJS
等模板引擎的角度出发的,这可能是我找不到简单方法解决的主要原因— 不知道...
示例:矩阵Table(例如一年中的时间段按每周分辨率计算)
数据(DATA
):
[
{
name:'Slot 1',
slot:{
start:3,
end:5
}
},
{
name:'Slot 2',
slot:{
start:32,
end:50
}
},
{
name:'Slot 3',
slot:{
start:10,
end:26
}
}
]
可视化:
数据应呈现为矩阵 table
,其中包含三个 rows
(与数据中的项目一样多的行)
并且决议为每 row
52 周 (cells
)。范围 (start
- end
) 应该在 table.
中突出显示
如上所述,我从其他模板引擎的角度出发,因此我试图弄清楚如何在 angular 中编写 loops
左右以获得此可视化。在其他模板引擎中,我会 'interpret' 模板中的数据并在两个 loops
中创建 HTML
因为这个 "overloading" 仅与视觉目的相关。
动态生成的标记 (EJS
) - 方式
<table>
<% var i, weeks=52;
for(i=0;i<DATA.length;i+=1){
%>
<tr>
<td><%-DATA[i].name%></td>
<% var j;
for(j=1;j<=weeks;j+=1){
%>
<td class="<%((j>=DATA[i].slot.start && j<= DATA[i].slot.end)?'in-range':'')%>">
<%- j %>
<td>
<%}%>
</tr>
<%}>
</table>
问题:
实际上我无法在 Angular 2.x
中以有效的方式解决这个问题,我唯一能实现的解决方案(当然不好)是写下整个 HTML
对于这样一个 table
矩阵。
每当所需的 HTML
发生变化时(例如添加 class
左右),这最终会导致巨大的开销。我知道在标记中搜索和替换 ;) 但它仍然需要维护很多可以生成的标记,我认为在 Angular2 中也必须有一种方法可以做到这一点。
感谢您为我指明更好方向的任何帮助。
您可以使用此代码获得所需的布局:
<table>
<tr *ngFor="let row of DATA">
<td>{{ row.name }}</td>
<td *ngFor="let week of weeks"
[class.in-range]="row.slot.start <= week && week <= row.slot.end">
{{ week }}
</td>
</tr>
</table>
其中 weeks = [1, 2, 3, ..., 52]
或者,使用此辅助函数:
export function range(count: number, from = 0) {
return Array.from(Array(count)).map((_, i) => i + from);
}
<td *ngFor="let week of range(52)">
在前端处理数据时,通常很难将数据可视化以供用户理解。要可视化的(动态)数据结构良好且简单(重点关注数据大小和防止过载)。
但下面的数据结构 (DATA
) 当然不是用户的最佳视觉表示。
让我用下面的例子解释一下我还不能很好解决的问题:
这里我要指出的是,我是从EJS
等模板引擎的角度出发的,这可能是我找不到简单方法解决的主要原因— 不知道...
示例:矩阵Table(例如一年中的时间段按每周分辨率计算)
数据(DATA
):
[
{
name:'Slot 1',
slot:{
start:3,
end:5
}
},
{
name:'Slot 2',
slot:{
start:32,
end:50
}
},
{
name:'Slot 3',
slot:{
start:10,
end:26
}
}
]
可视化:
数据应呈现为矩阵 table
,其中包含三个 rows
(与数据中的项目一样多的行)
并且决议为每 row
52 周 (cells
)。范围 (start
- end
) 应该在 table.
如上所述,我从其他模板引擎的角度出发,因此我试图弄清楚如何在 angular 中编写 loops
左右以获得此可视化。在其他模板引擎中,我会 'interpret' 模板中的数据并在两个 loops
中创建 HTML
因为这个 "overloading" 仅与视觉目的相关。
动态生成的标记 (EJS
) - 方式
<table>
<% var i, weeks=52;
for(i=0;i<DATA.length;i+=1){
%>
<tr>
<td><%-DATA[i].name%></td>
<% var j;
for(j=1;j<=weeks;j+=1){
%>
<td class="<%((j>=DATA[i].slot.start && j<= DATA[i].slot.end)?'in-range':'')%>">
<%- j %>
<td>
<%}%>
</tr>
<%}>
</table>
问题:
实际上我无法在 Angular 2.x
中以有效的方式解决这个问题,我唯一能实现的解决方案(当然不好)是写下整个 HTML
对于这样一个 table
矩阵。
每当所需的 HTML
发生变化时(例如添加 class
左右),这最终会导致巨大的开销。我知道在标记中搜索和替换 ;) 但它仍然需要维护很多可以生成的标记,我认为在 Angular2 中也必须有一种方法可以做到这一点。
感谢您为我指明更好方向的任何帮助。
您可以使用此代码获得所需的布局:
<table>
<tr *ngFor="let row of DATA">
<td>{{ row.name }}</td>
<td *ngFor="let week of weeks"
[class.in-range]="row.slot.start <= week && week <= row.slot.end">
{{ week }}
</td>
</tr>
</table>
其中 weeks = [1, 2, 3, ..., 52]
或者,使用此辅助函数:
export function range(count: number, from = 0) {
return Array.from(Array(count)).map((_, i) => i + from);
}
<td *ngFor="let week of range(52)">