如何将#evaluate的结果分配给变量?

问题描述 投票:0回答:1

上下文:

[在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

实际上,此示例代码一行显示一个字段列表,而其中某些字段(special字段)则显示为一行2($pageDoc.display($field)是XWiki惯用语,用于显示获取可显示值来自页面中包含的对象)

问题:

对于其他渲染引擎,我现在需要将行传递给引擎:

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

但是$engine.addLine(#evaluate($special[$field]))无法工作,因为#evaluate 直接输出其求值并且不返回任何内容。

问题

是否有速度将#evaluate的结果存储在变量中?

velocity
1个回答
0
投票

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

技巧的(第一部分)是让#evaluate评估#set,例如(请注意,这是不正确的:]

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

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

关于第二部分,它仅给出:

#evaluate("\#set(\$resul= ""$special[$field]"")")
$engine.addLine($resul)
© www.soinside.com 2019 - 2024. All rights reserved.