2

我为这个问题搜索了很多。我只想在 scala html 模板中创建一个变量,并且需要一个临时变量。

我找到的唯一“有意义”的解决方案如下:

@defining("hello text") {testvariable =>
    <h1>output of variable: @testvariable</h1>
}

这真的是唯一的方法吗?playframework的人是认真的吗?我不想将变量值从控制器传递给模板。我只想创建一个局部简单变量并在“if-block”中为其分配一个值,仅此而已。

4

3 回答 3

4

是的,我认为 Play 的人是认真的。

第一的。

将变量定义为hardcoded模板的元素是什么意思?好的,我知道您不想多次插入一个值,但是您展示的方式可以@defining解决问题。另一方面 - 如果您只想放置变量以将其用作if块中的条件,那也没有意义,因为您也可以编写类似的东西@if(1==1){ code }来模拟某些行为。在其他情况下,您的变量应该由控制器确定,并且为了清楚起见,您可以使用一些 Map 来将变量组controllersview.

第二。

Play 中的 Scala 模板只是函数,这意味着您还可以调用其他函数或方法。例如,您可以调用一些getter或另一种方法,该方法将执行并返回您想要的任何内容。样本很多,所以我将跳过这部分。

第三。

如第二部分所述,如果您不喜欢@defining 方法,您可以在应用程序的某个位置(让我们考虑一下app/controllers/Application.java)创建一些超级简单的方法来存储和设置/获取一些值。当然,如果您打算使用许多“变量”,最好将其存储在一张地图中,而不是为每个地图创建单独的 getter 和 setter。

在您的Application控制器中,只需添加这些简单的方法(如果需要,还可以为其他类型创建自己的 getter)

private static Map<String, Object> map = new HashMap<String, Object>();

// setter
public static void setValue(String key, Object value) {
    map.put(key, value);
}

// general getter would work well with String, also numeric types (only for displaying purposes! - not for calculations or comparisons!)
public static Object getValue(String key) {
    return map.get(key);
}

public static Boolean isTrue(String key) {
    return  Boolean.valueOf(map.get(key).toString());
}

public static Double getDouble(String key) {
    return Double.valueOf(map.get(key).toString());
}

所以接下来你可以view通过设置和读取 Map 键和值来使用它

@Application.setValue("name", "Stefan")
@Application.setValue("age", 30)
@Application.setValue("developer", false)
@Application.setValue("task1", 123.5)
@Application.setValue("task2", 456.7)


<h1>ellou' @Application.getValue("name")!</h1>

<div>
    Today there are your  @Application.getValue("age") birthday!
</div>

<div>
    You are @if( Application.isTrue("developer")  ) {
        very big developer
    } else {
        just common user
    }
</div>

<div>
    Once again: @{ val status = if (Application.isTrue("developer"))  "veeeeery big developer" else "really common user"; status }
</div>

<div>
    Today you earned $ @{ Application.getDouble("task1") + Application.getDouble("task2") }
</div>


<div> etc... </div>

如您所见,您甚至可以执行一些基本操作,无论如何,对于更复杂的任务,我会将权重从(仅)模板引擎重定向到专用控制器的方法。

于 2012-06-27T20:40:20.643 回答
0

该示例不是“将变量值从控制器传递到模板”。它将一个值绑定到一个变量,以允许在后续大括号的范围内重用它,这似乎正是您想要的。即,您将在模板中使用该代码并通过将“hello text”绑定到 testvariable 它将产生:

<h1>output of variable: hello world</h1>

即它与控制器无关。

如果您在尝试使用它的地方发布一些模板代码,我们可能会提供帮助。

于 2012-06-27T20:24:13.453 回答
0

很抱歉创建了一个僵尸......但由于我最终在这里搜索自己,我想通过详细说明我的首选替代方案 Biesiors 的第二个替代方案来做出贡献(以一个简单的条纹行示例):

/** This goes in the top of the scala template, before the HTML **/
@injectStripeColor(index: Integer) = @{
    if(index % 2 == 0){
        "#EEE" // Even row
    } else {
        "#AAA" // Odd row
    }
}

您现在有了一个可以在模板中使用的函数。(您也可以将上面的函数存储在一个单独的文件中,只要您需要它就可以将它包含在需要它的任何模板中)。

/** This goes in your row loop where i is current index **/
<tr><td style="background-color: @injectStripeColor(i)"> @content </td></tr> 
于 2014-08-05T13:22:12.687 回答