再次调用相同的Play模板时,变量如何作用域?

时间:2011-12-01 14:48:50

标签: java templates view playframework

我正在编写一个标记,用于跟踪调用的时间,以便为其元素生成唯一ID:

%{
    try {
      coolTagId++;
    } catch (Exception) {
      coolTagId = 0;
    }
}%
<div id='cool-tag-${coolTagId}'></div>

...

$('#cool-tag-${coolTagId}').click(function(){alert("Cool Tag ${coolTagId} clicked")});

当我多次在页面中包含此标记时,令我惊讶的是,我发现每次评估时coolTagId都为0。为什么会这样?

(在此期间我将使用某种UID,我只是想了解为什么上面的代码段不起作用)

2 个答案:

答案 0 :(得分:2)

我不知道为什么,但这并不让我感到惊讶。 Play是一个无状态框架,因此它似乎不会在相同标签的两个实例之间共享状态。

有趣的是,即使使用#{set coolTagId:0 /}预先设置值也不起作用。

然而,在标记中设置值的工作原理是什么。将其放在代码的末尾:#{set coolTagId:coolTagId /}。这样您就可以手动将值推送到基本模板。

答案 1 :(得分:1)

这是一个简单的范围问题。

想象一下,用纯Java编写这个,标签实际上是在调用一个方法。标记中定义的所有内容(即方法)都本地作用于该标记,因此一旦标记被执行就不会存在,因为它会离开作用域。

这样做的原因是为了确保标签外的任何内容都不会因标签的执行而被破坏或修改。除了传入的参数外,一切都是自包含的。