流星递归模板无效(Meteor recursive template doesn't wor

2019-10-22 01:24发布

我想有这样一个递归模板:

<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上。 谢谢everybuddy!

Answer 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>

看看这个谅解Spacebars一个更好的学习经验



Answer 2:

不同于使用Javascript, Spacebars认为空数组[]是falsy 。 因此初始{{#if elements}}在叶节点(其具有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>


文章来源: Meteor recursive template doesn't work