如何更新chunk.render的尘埃助手中的上下文

时间:2015-03-05 00:54:23

标签: dust.js

我正在使用linkedin的版本的dustjs。我想创建一个自定义帮助程序,更新上下文以更具体地呈现上下文的主体。

我该怎么做?

目前说上下文:

{
    title: "News",
    items: [],
    nav: {
       logo: 'logo.png',
       items: []
    },
    body: {
       items: []
    }
}

如果我只是在我的帮助器中使用chunk.render(bodies.block,context),它将在上下文级别。但我希望用较低的“导航”范围进行渲染。电平:

{
 logo: 'logo.png',
 items: []
}

有点相关,是否可以将chunk.render调用的范围/上下文设置为更高的对象?

假设我一直在使用数组循环助手{#items} {/ items}并且循环体内的上下文被设置为每个数组元素,我可以写一个帮助器来设置其自身体的上下文更高并在对象的完全不同的分支?喜欢' body'一个?

我知道使用{#items:body},但我有兴趣根据存储在每个数组元素中的键将范围更改为对象的不同部分。

1 个答案:

答案 0 :(得分:1)

要使用选定的上下文子集进行渲染,您可以使用context.rebase生成新的上下文。

此示例使用上下文帮助程序来简洁,但您也可以使用常规的Dust帮助程序。

模板

{#subcontext key="nav"}
  {#items}{.}{/items}
{/subcontext} 

上下文

{
  "subcontext": function(chunk, context, bodies, params) {
    var subcontext = context.get(params.key);
    return chunk.render(bodies.block, context.rebase(subcontext));
  },
  "items": ["Oh", "No"],
  "nav": {
    "items": ["Yay", "Yay"]
  }
}

回答你的第二个问题:

是的,您可以向后遍历上下文堆栈。我将此部分作为练习留给您,但这里是您需要的指导:

助手中的context对象有一个名为stack的属性。 stack有一个名为tail的属性,它本身就是Stack的一个实例。对于您的上下文的每个级别,都有一个嵌套tail,因此根据您想要执行向后查找的方式,您可以移动到堆栈上的任何位置,然后使用{{1}调用context.rebase } {' s tail设置不同的上下文。