2015-02-24 120 views
1

我想有一个递归模板是这样的:流星递归模板无效

<template name="generate"> 
    {{#if elements}} 
    {{#each elements}} 
     <div>{{#if elements}}{{> generate}}{{/if}}</div> 
    {{/each}} 
    {{else}} 
    {{> generate elements=getElements}} 
    {{/if}} 
</template> 

与助手:

Template.generate.helpers({ 
    getElements: function() { 
    return Elements.find() 
    } 
}) 

和 “元素” 数据对象:

[{ 
    _id : "fgQ4GHrrZGFFGWPZQ", 
    elements" : [{ 
    _id : "hY8iAYJC4KBwGKN84", 
    elements : [] 
    }] 
},{ 
    _id : "rtMNfaQYwqzNTYqoD", 
    elements : [{ 
    _id : "p2wJeGdtiGMYBQtpW", 
    elements : [] 
    }] 
}] 

我遇到了键盘事件变得无响应并且其他功能停止工作的问题。是不是设计用于处理这种递归的模板?如果是这样,我会尝试一种不同的方法,但我认为这将工作。任何人看到这个或有任何建议?谢谢!

编辑:这将工作。我的问题是在“render”回调中设置了一个键盘事件处理程序,这个回调函数被多次调用(每次模板被渲染时)导致我提到的问题。我会删除这个问题,但stackoverflow。谢谢everybuddy!

+0

我肯定模板可以处理递归,所以你可能有无限递归。请记住,空数组('[]')是真的。 – 2015-02-24 07:43:41

+0

注意自我:总是复制/粘贴而不是使用自己的单词,所以不会出现愚蠢的拼写错误([空阵列在Space栏中的#if块中是虚假的](https://github.com/meteor/meteor/blob/devel /packages/spacebars/README.md#ifunless),作为(类型)在下面的答案中提到的一种)。 – 2015-02-24 13:55:15

+0

看起来像这样可以起作用。我的代码中有其他错误。感谢大家的帮助! – brg 2015-02-24 23:35:19

回答

1

这里有一些错误。

首先。你具有助手名为getElements您在调用它像elements

您呼叫的模板到同一个模板{{> generate}}

<template name="generate"> 
    {{#if elements}} 
    {{#each getElements}} 
     <div>{{#if elements}}{{> anotherTemplateName}}{{/if}}</div> 
    {{/each}} 
    {{else}} 
    {{> generate elements=getElements}} 
    {{/if}} 
</template> 

另外,elements助手看起来如何? {{#if elements}}

建议将在这里使用嵌套模板。

<template name="generate"> 
     {{#if elements}} 
     {{> generateExample}} 
     {{else}} 
     {{> generate elements=getElements}} 
     {{/if}} 
    </template> 

<!-- Generate Example Template --> 

    <template name="generateExample"> 
      {{#each getElements}} 
       <div>{{#if elements}}{{> anotherTemplateName}}{{/if}}</div> 
      {{/each}} 
    </template> 

看看这个Understanding Spacebars一个更好的学习体验

+0

没有错误。我的代码中有其他的东西导致了问题。谢谢您的帮助! – brg 2015-02-24 23:36:23

0

不同的Javascript,Spacebars considers an empty array [] to be falsy。因此叶节点(其中elements: [])上的起始{{#if elements}}将为假,触发{{> generate elements=getElements}},最终导致无限递归。

您可以通过完全移除{{#if}},然后调用{{> generate elements=getElements}}当您最初包括generate解决这个问题:

<body> 
    {{> generate elements=getElements}} 
</body> 

<template name="generate"> 
    {{#each elements}} 
     <div>{{#if elements}}{{> generate}}{{/if}}</div> 
    {{/each}} 
</template> 
+0

这不会起作用,因为我不想将辅助器分配给正文模板。无论如何感谢您的帮助! – brg 2015-02-24 23:37:27