【问题标题】:Meteor recursive template doesn't work流星递归模板不起作用
【发布时间】:2015-04-25 17:23:27
【问题描述】:

我试图有一个这样的递归模板:

<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 : [] 
  }]
}]

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

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

【问题讨论】:

  • 我很确定模板可以处理递归,所以你可能有无限递归。请记住,空数组 ([]) 是真实的。
  • 自我注意:总是复制/粘贴而不是使用自己的话,所以不会出现愚蠢的拼写错误(empty arrays are falsy in #if-block in Spacebars,如下面的答案之一中提到的(有点))。
  • 看起来这毕竟可以工作。我的代码中的其他地方有错误。感谢大家的帮助!

标签: templates recursion meteor meteor-blaze spacebars


【解决方案1】:

这里有一些错误。

首先。您有一个名为 getElements 的助手,您将其称为 elements

第二你是调用模板到同一个模板{{&gt; 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 以获得更好的学习体验

【讨论】:

  • 没有错误。我的代码中其他地方还有其他导致问题的东西。感谢您的帮助!
【解决方案2】:

与 Javascript 不同,Spacebars considers an empty array [] to be falsy。因此叶节点(具有elements: [])上的初始{{#if elements}} 将是错误的,触发{{&gt; generate elements=getElements}},最终导致无限递归。

您可以通过完全删除{{#if}} 来解决此问题,然后在您最初包含generate 时调用{{&gt; generate elements=getElements}}

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

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

【讨论】:

  • 这行不通,因为我不想为正文模板分配助手。无论如何感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-18
  • 1970-01-01
  • 1970-01-01
  • 2016-05-04
  • 2014-04-22
  • 2013-09-17
  • 2015-10-15
相关资源
最近更新 更多