Что такое хороший способ создать переменную в 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}} если не занимаюсь составлением шаблона.

Другие вопросы по тегам