Шаблоны jQuery — слишком много рекурсии

#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 уровней; однако при используемой вами структуре вам, вероятно, не следует этого делать.

«Затем мои шаблоны рекурсивно вызывают друг друга»

От разметки у меня болит голова, поэтому я испытываю некоторые трудности с чтением кода (моя проблема, не ваша), но каждый раз, когда я достигал предела стека для рекурсии для чего-либо, это было либо потому, что я намеренно подчеркиваю что-то с помощью глубокой рекурсии, либо потому, что у меня где-то есть циклическая ссылка, так что моя рекурсия никогда не завершается.

Итак, в общем: убедитесь, что у вашей функции есть способ завершить работу, вместо того, чтобы вечно создавать новые экземпляры самой себя.