【问题标题】:What is a good way to create a variable in JsRender?在 JsRender 中创建变量的好方法是什么?
【发布时间】:2017-07-25 22:39:59
【问题描述】:

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

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

但是,伪造的if 很烦人。有没有更好的办法?

【问题讨论】:

  • 你能做一个比 if 更语义化的自定义标签吗?
  • 嗯,我猜。我希望我忽略了一个明显的内置解决方案

标签: javascript variables jsrender


【解决方案1】:

如果你可以在模板外初始化myVariable,那么你可以将其设为helper variable,并传入:

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

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

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

  • 这是顶级数据,您可以像上面一样传入帮助器
  • 或者它是从另一个(布局)模板呈现的“部分”模板,使用{{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}}

编辑:

在您的特定情况下,根据您在下面添加的 cmets,您需要在 {{for someArray}} 内的项目块的上下文中进行初始化 - 以获取项目数据。

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

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

【讨论】:

  • 谢谢,这是一个非常有用的答案。我的案例是从另一个模板呈现的模板。我不太确定如何在这里遵循您的建议。模板调用如:{^{for results tmpl="#resultListItemTemplate" /}},问题是函数调用需要#dataINSIDE这个被调用的模板作为参数,我不知道如何在for语句中访问它;这可能吗?对于{^{for results tmpl="#resultListItemTemplate" ~myVar=myFunc(#data)/}}#data 仍然是指 for 循环之外的数据,对吧? – 如果这不可能,我会选择include :)
  • 啊,是的,如果您的上下文需要项目数据,则需要包装在 {{include}} 中。我更新了我的回复以包含那个场景......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-18
  • 1970-01-01
  • 2010-10-12
  • 1970-01-01
  • 2011-08-11
  • 2017-04-13
  • 1970-01-01
相关资源
最近更新 更多