Рекурсивные шаблоны jQuery с пользовательскими функциями, вызывающими переполнение стека? - PullRequest
0 голосов
/ 02 сентября 2011

Я создаю систему шаблонов jQuery, которая рекурсивно вызывает тот же шаблон, что и при необходимости.Большинство примеров "рекурсивных" шаблонов на самом деле являются просто шаблонами, вызывающими другие шаблоны, даже те, которые передают объект $item для сохранения пользовательских функций .В этом случае я хочу вызвать тот же шаблон с частью исходного $data (AKA $item.data), а также передать пользовательские функции шаблона, переданные параметрам исходного вызова tmpl.

// original template call
$("#someTemplate").tmpl(data, {
    someFunction1: function(itemToCheck) {
        return itemToCheck.p3;
    },
    someFunction2: function(itemToCheck) {
        return itemToCheck.p1 + ", " + itemToCheck.p2;
    }
}).appendTo(".results");

<!--in-template secondary call-->
{{tmpl($data.sub, $item) "#someTemplate"}}

Полный код jsFiddle

Кажется, что пропуск $item в качестве параметра параметров для рекурсивного вызова приводит к игнорированию параметра данных, возможно, из-за $item.data содержит исходный объект и просто перезаписывает новый параметр данных.В результате на каждом рекурсивном уровне я все еще работаю на исходном уровне вызывающего объекта в объекте и не продвигаюсь дальше в структуре объекта (отсюда проблема стека).

Есть ли какое-то другое свойство $item Мне нужно использовать для передачи только пользовательских функций без $item.data переопределения передаваемых данных шаблона?

Обновление

Вы определенно не можете просто передать $item в качестве параметровпараметр до {{tmpl}}.После просмотра кода он устанавливает data для нового вызова шаблона, а затем удаляет его с оригинальными $item.data через jQuery.extend несколькими строками позже.

1 Ответ

0 голосов
/ 20 сентября 2011

Хотя я не могу найти переменную в $item, которая охватывает все пользовательские функции, я смог обойти эту проблему, передав каждую пользовательскую функцию отдельно от исходного объекта $item.Не идеально, но работает.

{{tmpl($data.sub, { someFunction1: $item.someFunction1, someFunction2: $item.someFunction2 }) "#someTemplate"}}
...