dust.js中的间接方向

时间:2013-01-22 16:08:33

标签: dust.js

是否有可能在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}

这不像书面那样有效;我可以捕获{.}的输出(当前键的值)并动态地将其用作要解析的属性名称(的一部分)吗?

2 个答案:

答案 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>