首页 > 解决方案 > 如何将`#evaluate`的结果分配给变量?

问题描述

语境:

在 XWiki 站点中,我大量使用速度模板来表示对象的特定表示。在特定模板中,我需要能够具有一个间接级别以允许对某些字段进行特殊处理。我设法将公式放入变量中并在渲染时对其进行评估。

我当前的(简化的)代码是:

#set($special = { 'field1': 'F1: $pageDoc.display("field1") - F2: $pageDoc.display("field2")',
                  'field2': '' }
...
#foreach($field in $fields):
  #if($special.contains($field))
    #if("$special[$field]" != "")
      <p>#evaluate($special[$field])</p>
    #end
  #else
    <p>$pageDoc.display($field)</p>
  #end
#end

事实上,这个示例代码在一行中显示一个字段列表,而其中一些(特殊字段)连续显示 2 个($pageDoc.display($field)是一个 XWiki 习惯用法,用于显示从页面中包含的对象获取可显示的值)

问题:

对于不同的渲染引擎,我现在需要将这些行传递给引擎:

$engine.addLine($pageDoc.display($field))

但是$engine.addLine(#evaluate($special[$field]))不能工作,因为#evaluate 直接输出它的评估并且不返回任何东西。

问题

速度有没有办法将结果存储#evaluate在变量中?

标签: velocity

解决方案


在速度中,#evaluate仅执行其内容。观察到所有副作用,主要是输出,但什么都不能返回。

诀窍的(第一部分)是必须#evaluate评估 a #set,例如(注意这个是不正确的):

#evaluate(#set($resul = $special[$field]))
$engine.addLine($resul)

如果要在评估的字符串中转义特殊字符的问题,因为第一部分不应评估,而第二部分应评估,并且该速度具有相当奇怪的转义规则:#and$应使用 进行转义\,而'and"应加倍。 ..

对于第二部分,它只是给出:

#evaluate("\#set(\$resul= ""$special[$field]"")")
$engine.addLine($resul)

推荐阅读