0

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

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

4

2 回答 2

2

所以,简短的回答是否定的,你不能在 Dust 中这样做。

Dust 本来就是一种无逻辑的语言,而这与太多的逻辑接壤。通常,此类问题的答案是更新您的 JSON,使其在 Dust 中正常工作。在您给出的示例中,这可以很容易地完成,但在现实世界的情况下可能会困难得多。Dust 的部分力量在于它的局限性。

如果此答案对您不起作用,欢迎您在 GitHub 上提交拉取请求:https ://github.com/linkedin/dustjs

于 2013-01-22T18:45:17.757 回答
2

正如 smfoote 所说,Dust 中不支持开箱即用。

但是,我意识到处理程序可能涉及一些逻辑元素,因此编写一个处理程序来进行取消引用相对简单:

  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 的替代方法不是一个选项(模板不知道密钥将提前是什么,因此无法在此处编写“静态”引用),这似乎是一种合理的方法。

于 2013-01-23T15:23:12.250 回答