在 JsRender 中创建变量的好方法是什么?

What is a good way to create a variable in JsRender?

在 JsRender 模板中,块可以创建变量,所以我可以这样写:

{{if true ~myVariable=myExpensiveFunction()}}
  {{:~myVariable}} {{:~myVariable}}
{{/if}}

然而,伪造的 if 很烦人。有没有更好的方法?

如果你可以在模板外初始化myVariable,那么你可以把它做成一个helper variable,传入:

var html = myTmpl.render(data, {myVariable:myExpensiveFunction()});

如果您需要在特定的 template/data 上下文中进行初始化,那么正如您所说,您可以使用 contextual parameters,它适用于任何模板块。使用包装该上下文的标签。

如果上下文是模板中的顶级,则:

  • 要么这是顶级数据,你可以像上面那样传入一个助手
  • 或者它是从另一个(布局)模板呈现的 'partial' 模板,使用 {{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}} 中的项目块的上下文中进行初始化 - 以便获取项目数据。

(其实你的item block是一个使用{{for someArray tmpl=...}}调用的'partial'模板,但是基本问题是一样的)

在这种情况下,如果不进行模板组合,您确实需要在顶层(为您)或 {{for}} 内添加一个 {{include}} 包装器。