我一直在研究doT javascript templating engine,但我的数据是奇怪的格式。在进入模板之前是否有一些内置的方法来处理每一行?我宁愿在渲染之前动态构建单独的行对象,而不是事先克隆并修改整个数据数组,这当然会起作用。我也可以深入研究代码并自行解决,但我想确保我没有错过标准功能。
有没有更好的地方可以提出有关doT的问题?
编辑:为了更全面地解释我正在尝试做什么,这就是数据的样子(将序列化为JSON的ColdFusion查询):
{
"COLUMNS": ["fname", "lname"],
"DATA":
[
["John", "Smith"],
["Jean", "Summers"],
["Jane", "Sturgess"]
]
}
所以一个尴尬的答案就是这样:
{{~it.DATA :v:i}}
<div>{{=v[it.COLUMNS.indexOf('fname')]}} {{=v[it.COLUMNS.indexOf('lname')]}} ({{=i}}</div>
{{~}}
您也可以对列索引进行硬编码,但模板的可读性要低得多。
但我宁愿模板更简洁,更直观。这是朝这个方向迈出的一步,但仍然很时髦:
{{
var cols = {};
for(var i=0, n=it.COLUMNS.length; i<n; i++) {
cols[it.COLUMNS[i]] = i;
}
{ }}
{{ } }}
{{~it.DATA :v:i}}
<div>{{=v[cols.fname]}} {{=v[cols.lname]}} ({{=i}})</div>
{{~}}
另一步,手工编码,但模板有点漂亮:
{{##def.fname:{{=v[0]}}#}}
{{##def.lname:{{=v[1]}}#}}
{{~it.DATA :v:i}}
<div>
{{#def.fname}} {{#def.lname}} ({{=i}})
</div>
{{~}}
你可以生成那些部分内容,但我非常怀疑你是否可以将该步骤作为模板本身的一部分。
可能更好的解决方案是跳过代码段,让外部代码从数据中读取列定义,读取模板,将这些“{{= colName}}”中的colName替换为列定义中查找的索引,然后编译并运行结果。
如果有人对此有任何进一步的想法,我很乐意听到它们。