#javascript #jquery #jquery-plugins #jquery-templates
#javascript #jquery #jquery-плагины #jquery-шаблоны
Вопрос:
Я использую шаблоны jquery для создания древовидной структуры для отображения древовидных разделов и элементов.
Структура данных выглядит следующим образом, где в каждом разделе есть элементы и секции, и у каждого элемента может быть больше разделов:
section
items
item
sections
item
sections
sections
section
sections
items
...and so on
Затем мои шаблоны рекурсивно вызывают друг друга:
<script id="my-item-tmpl" type="text/x-jquery-tmpl">
<li>
<span>${text}</span>
<ul>
{{each sections}}
{{tmpl($value) "sectionTmpl"}}
{{/each}}
</ul>
</li>
</script>
<script id="my-section-tmpl" type="text/x-jquery-tmpl">
<li>
<span>${text}</span>
<ul>
{{each items}}
{{tmpl($value) "itemTmpl"}}
{{/each}}
{{each sections}}
{{tmpl($value) "sectionTmpl"}}
{{/each}}
</ul>
</li>
</script>
$("#my-item-tmpl").template('itemTmpl');
$("#my-section-tmpl").template('sectionTmpl');
$.tmpl('sectionTmpl', { section }).appendTo(this);
Однако я обнаружил, что примерно на 4 уровнях структуры я получаю "too much recursion
«ошибку в моей консоли.
Это просто ограничение движка шаблонов jQuery?
Редактировать:
Я решил эту проблему, удалив {{each}}
и заменив его {{tmpl}}
вызовом. {{each}}
Не понадобилось. Я также обернул каждый {{tmpl}}
вызов в {{if}}
, чтобы убедиться, что коллекция существует.
Комментарии:
1. Возможно, это предупреждение о том, что вы собираетесь получить ошибку переполнения стека.
Ответ №1:
Javascript имеет ограничение на рекурсию примерно в 1000 уровней; однако при используемой вами структуре вам, вероятно, не следует этого делать.
«Затем мои шаблоны рекурсивно вызывают друг друга»
От разметки у меня болит голова, поэтому я испытываю некоторые трудности с чтением кода (моя проблема, не ваша), но каждый раз, когда я достигал предела стека для рекурсии для чего-либо, это было либо потому, что я намеренно подчеркиваю что-то с помощью глубокой рекурсии, либо потому, что у меня где-то есть циклическая ссылка, так что моя рекурсия никогда не завершается.
Итак, в общем: убедитесь, что у вашей функции есть способ завершить работу, вместо того, чтобы вечно создавать новые экземпляры самой себя.