是否有可能在dust.js中实现变量间接 - 因此能够使用类似地图的功能?
想象一下,我有以下背景传递给Dust:
{
"keys": [ "Foo", "Bar", "Baz" ],
"data": [{
"date": "20130101",
"values": {
"Foo": 1,
"Bar": 2,
"Baz": 3
}
}, {
"date": "20130102",
"values": {
"Foo": 4,
"Bar": 5,
"Baz": 6
}
}]
}
我希望实现以下输出(它实际上是一个表格,但为了简洁我省略了<tr><td>
标签,并用空格和换行符替换它们:
Date Foo Bar Baz
20130101 1 2 3
20130102 4 5 6
我不确定如何循环keys
属性,并使用每个值x
来查找data[i].values[x]
。我可以通过硬编码键来获得所需的输出:
Date{~s}
{#keys}
{.}{~s}
{/keys}
{~n}
{#data}
{date}{~s}
{values.Foo}{~s}
{values.Bar}{~s}
{values.Baz}{~s}
{~n}
{/data}
但键会动态确定,所以我无法将它们硬编码到模板中。有没有办法用以下内容替换说values.Foo
等的行:
{#data}
{date}{~s}
{#keys outerMap=values}
{outerMap.{.}}{~s}
{/keys}
{~n}
{/data}
这不像书面那样有效;我可以捕获{.}
的输出(当前键的值)并动态地将其用作要解析的属性名称(的一部分)吗?
答案 0 :(得分:2)
所以,简短的回答是否定的,你不能在尘埃中做到这一点。
尘埃是一种无逻辑的语言,这接近于过多的逻辑。通常,像这样的问题的答案是更新您的JSON,以便它在Dust中正常工作。这可以在您给出的示例中轻松完成,但在现实世界中可能会更加困难。尘埃的部分力量在于其局限性。
如果这个答案对您不起作用,欢迎您在GitHub上提交拉取请求:https://github.com/linkedin/dustjs
答案 1 :(得分:2)
正如smfoote所说,尘埃中不支持开箱即用。
但是,我已经意识到处理程序可能涉及一些逻辑元素,因此编写处理程序进行解除引用相对简单:
deref: function(chunk, context, bodies, params) {
chunk.write(params.obj[params.prop]);
}
此处理程序采用obj
参数,该参数是用作关联数组的对象;以及描述从该对象查找的键的prop
参数。通过将此处理函数添加到上下文中,我可以将模板的数据部分写为:
{#data}
{date}{~s}
{#keys}
{#deref obj=values prop=./}{~s}
{/keys}
{~n}
{/data}
通过迭代每个键并将其作为要从values
对象读取的属性传递,可以生成正确的输出。
我很欣赏有些人可能会认为这是不恰当的,因为Dust的哲学。但是,我不认为它构成特别复杂的逻辑;事实上,它可以说是模板框架的一部分。鉴于smfoote建议的替换更新我的JSON不是一个选项(模板不知道密钥将提前是什么,所以这里没有办法写“静态”引用),这似乎是一种合理的方法。 / p>