Рекурсивный шаблон Meteor не работает

Я попытался создать рекурсивный шаблон следующим образом:

<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. Спасибо друг!


person brg    schedule 24.02.2015    source источник
comment
Я совершенно уверен, что шаблоны могут обрабатывать рекурсию, поэтому у вас, вероятно, бесконечная рекурсия. Помните, что пустые массивы ([]) правдивы.   -  person Peppe L-G    schedule 24.02.2015
comment
Примечание для себя: всегда копируйте/вставляйте вместо использования собственных слов, чтобы не возникало глупых опечаток (пустые массивы являются ложными в #if-block в пробелах, как (вроде) упомянуто в одном из ответов ниже).   -  person Peppe L-G    schedule 24.02.2015
comment
Похоже, это все-таки может сработать. У меня были ошибки в другом месте моего кода. Спасибо всем за помощь!   -  person brg    schedule 25.02.2015


Ответы (2)


У вас есть некоторые ошибки здесь.

Во-первых. у вас есть помощник по имени 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>

Ознакомьтесь с этим Знакомство с клавишами пробела, чтобы лучше изучить его.

person Ethaan    schedule 24.02.2015
comment
Ошибок не было. В моем коде были другие вещи, которые вызывали проблемы. Спасибо за помощь! - person brg; 25.02.2015

В отличие от Javascript, пробел считает пустой массив [] ложным. Таким образом, начальный {{#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>
person user3374348    schedule 24.02.2015
comment
Это не сработало бы, потому что я не хотел назначать помощника для шаблона тела. Спасибо за помощь в любом случае! - person brg; 25.02.2015