如何将velocity上下文变量作为局部变量使用

3
在Velocity中,我遇到了一个问题。让我来清楚地解释一下。我在类中声明了以下内容:
private final static int MAX_TOOL_TITLE_LENGTH = 20;

//Putting into context
context.put("maxToolTitleLength","MAX_TOOL_TITLE_LENGTH");

现在在vm文件中,我正在将上下文变量值设置为不同的值

#if(true)
  #set($maxToolTitleLength=99) 
#end

在上面的vm文件中,我将值设置为99。我不想将该值设置为上下文变量。我只想在if语句中限制变量的作用域。在if语句之后,我不想得到值为99。它仍然保持上下文中的原始值。在Velocity中有其他方法可以实现这一点吗?
提前致谢。

不,速度没有作用域块。 - RaviH
那么如果我在模板文件中更改上下文变量的值,该如何解决问题?它不会影响上下文变量吗? - Laxman
如果您解释您试图解决的实际问题,可能可以提供解决方案。 - RaviH
在我的项目中有一个文本长度验证。我有四个文本框。对于三个文本框,我想允许20个字符。对于另一个文本框,我需要允许90个字符。在开发人员开发之前,他们在上下文中取一个变量并将值设置为20。在速度模板中,他们将此变量作为最大长度属性值提供。如果我在模板文件中更改该值,则会应用于所有文本框,因为它是上下文变量。那么如何将90赋给特定的文本框? - Laxman
3个回答

4

实际上,Velocity 中有一种引入本地变量的方式,尽管这可能有点令人惊讶:

#foreach ($maxToolTitleLength in [99])
...text that uses this $maxToolTitleLength definition...
#end
## now $maxToolTitleLength is back to whatever value it had before

[99] 是一个只有一个元素 99 的列表,所以这个循环只会执行一次。在循环中,$maxToolTitleLength 的值为 99。你也可以在循环内使用 #set ($maxToolTitleLength = $anotherValue)。在循环之前的值将在循环后恢复。


1

#foreach-hack(由@user2624542发现)可用于生成本地作用域。然而,至少在Polarion的相当老的Velocity 1.5版本中,宏内部的行为与外部不同。

在宏内部,作用域适用于现有变量(在全局上下文中),但对于未定义的变量则不适用。

$foo ## undef
#foreach ($foo in [99])
  $foo ## 99
  #set($foo=100)
  $foo ## 100
#end
$foo ## undef

#set($foo=0)
$foo ## 0
#foreach ($foo in [99])
  $foo ## 99
  #set($foo=100)
  $foo ## 100
#end
$foo ## 0

在宏内部

#macro(bar)
  $foo ## undef
  #foreach ($foo in [99])
    $foo ## 99
    #set($foo=100)
    $foo ## 100
  #end
  $foo ## 100 NOT undef
#end

$foo ## undef
#bar()
$foo ## 100 NOT undef

#macro(bar2)
  $foo ## 0
  #foreach ($foo in [99])
    $foo ## 99
    #set($foo=100)
    $foo ## 100
  #end
  $foo ## 0
#end

#set($foo=0)
$foo ## 0
#bar2()
$foo ## 0

0

无法更改上下文对象的值并使此更改仅在本地生效。我不明白为什么您不在模板中使用一个新变量来解决这个问题?

#if (true)
  #set($thisTitleLength=99) 
#end

或者如果您确实需要使用上下文变量来完成此操作,只需在您想要更改其值的块结束后恢复上下文变量即可:

#if (true)
  #set($maxToolTitleLength=99) 
  ## Do whatever you want with the new value
  ...
  ## Now restore its value
  #set($maxToolTitleLength=20)
#end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接