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

How to update context in dust helper for chunk.render

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

我该怎么做?

假设上下文当前是:

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

如果我只是在我的助手中使用 chunk.render(bodies.block,context) ,它将处于上下文级别。但我希望它以较低 'nav' 级别的范围呈现:

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

有点相关,是否可以将 chunk.render 调用的 scope/context 设置为更高层的对象?

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

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

要使用选定的上下文子集进行渲染,您可以使用 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,因此根据您想如何进行向后查找,您可以移动堆栈上的任何位置,然后使用 tail 调用 context.rebase head 设置不同的上下文。