1

我一直在研究doT javascript 模板引擎,但我的数据格式很奇怪。在进入模板之前是否有一些内置的方法来处理每一行?我宁愿在渲染之前动态构建单独的行对象,也不愿事先克隆和修改整个数据数组,这当然可以。我也可以深入研究代码并自己分叉,但我想确保我没有错过标准功能。

有没有更好的地方可以询问有关 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 替换为在列定义中查找的索引,然后编译并运行结果。

如果有人对此有任何进一步的想法,我很想听听他们的意见。

4

0 回答 0