我想创建一个递归模板,使其能够处理所有子项-无论深度如何。

可以说我的背景看起来像

{
  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,它们彼此引用。因此,现在我只需要确认“不可能”即可。

最佳答案

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

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

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

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


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

关于javascript - DustJS无限嵌套,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18799261/

10-09 17:56
查看更多