Что такое хороший способ создать переменную в JsRender?
В шаблоне JsRender блоки могут создавать переменные, поэтому я мог бы написать это:
{{if true ~myVariable=myExpensiveFunction()}}
{{:~myVariable}} {{:~myVariable}}
{{/if}}
Тем не менее, фальшивая if
раздражает. Есть ли способ лучше?
1 ответ
Если вы можете инициализировать myVariable
вне шаблона, вы можете сделать его вспомогательной переменной и передать ее в:
var html = myTmpl.render(data, {myVariable:myExpensiveFunction()});
Если вам нужно инициализировать в определенном контексте шаблона / данных, то, как вы говорите, вы можете использовать контекстные параметры, которые ограничены любым блоком шаблона. Используйте тег, который оборачивает этот контекст.
Если контекст является верхним уровнем в шаблоне, то:
- либо это данные верхнего уровня, и вы можете передать в помощнике, как указано выше
- или это "частичный" шаблон, отображаемый из другого шаблона (макета) с использованием
{{someTag tmpl=.../}}
, в этом случае вы можете установить свой контекстный параметр из вызывающего тега в другом шаблоне - или это рендеринг против массива
Для этого последнего случая вы можете использовать {{include}}
:
{{include ~myVariable=myExpensiveFunction()}}
{{:~myVariable}} {{:~myVariable}}
{{/include}}
или вы можете позвонить с noIteration
установить в true:
var html = myTmpl.render(data, [helpers,] true);
а затем завернуть в {{for}}
:
{{for ~myVariable=myExpensiveFunction()}}
{{:~myVariable}} {{:~myVariable}}
{{/for}}
РЕДАКТИРОВАТЬ:
В вашем конкретном случае, основываясь на ваших комментариях, добавленных ниже, вам нужно инициализировать в контексте блока элементов внутри {{for someArray}}
- чтобы получить данные о товаре.
(На самом деле ваш блок элементов является "частичным" шаблоном, называемым {{for someArray tmpl=...}}
, но основная проблема та же).
В этом случае вам действительно нужно добавить {{include}}
обертка, на высшем уровне (для вас) или в пределах {{for}}
если не занимаюсь составлением шаблона.