Шаблоны JQuery - слишком много рекурсии - PullRequest
12 голосов
/ 12 мая 2011

Я использую шаблоны 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 Ответ

3 голосов
/ 13 мая 2011

Javascript имеет предел рекурсии около 1000 уровней;с той структурой, которую вы используете, вы, вероятно, не должны поражать это, хотя.

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

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

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

...