1

我想创建一个递归模板,以便它处理所有的孩子——不管有多深。

可以说我的上下文看起来像

{
  div:true
  ,id:'root'
  ,children:[
    {div:true,id='root-1'}
    ,{div:true,id='root-2', children:[
      {div:true,id='root-2.1'} //etc,ect...      
     ]}
    }
}

我想说:

var div_tpl='{#div}'+
  '<div{#id} id="{id}"{/id}{#class} class="{class}"{/class}>'+
  '{#children}{>div_tpl/}{/children}'+ //self-ref here
  '</div>{/div}';

dust.compile(div_tpl,'div_tpl');

但是,当我向它提供数据时,它当然会挂起。我还尝试了 div_tpl1 和 div_tpl2,每个都引用另一个。所以现在我只需要确认这是“不可能的”。

4

1 回答 1

1

好消息是这是可能的。看来您遇到的麻烦与 Dust 查找的方式有关。目前,{#children}将在当前上下文中查找,然后(如果在当前上下文中没有找到任何内容)在所有父上下文中查找。

因此,在您的示例中,Dust 将开始渲染第一个 div ( id="root"),然后找到它children,并开始渲染它们。它会渲染第二个 div ( id="root-1"),然后查找children. 它不会children在当前上下文中找到,所以它会在父上下文中查找,它会在哪里找到children. 然后 Dust 会再次渲染第二个 div,再次搜索子元素,然后无限循环。

您可以通过使用点符号来避免无限循环:

...
{#.children}
    {>div_tpl/}
{/.children}
...

有关工作示例,请参阅此jsfiddle

于 2013-09-14T18:21:01.623 回答