play 2.0创建变量并赋值

时间:2012-06-27 18:31:15

标签: variables playframework-2.0

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

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

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

这真的是唯一的方法吗?来自playframework的人是否认真?我不想将控制器中的变量值传递给模板。我只想创建一个本地简单变量并在“if-block”中为其赋值,而不是其他。

3 个答案:

答案 0 :(得分:3)

是的,我认为Play玩家很认真。

首先。

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

第二

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

第三

如第二部分所述,如果你不喜欢 @defining方法,你可以在app中创建一些超级简单的方法(让我们考虑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中使用它
@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>

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

答案 1 :(得分:0)

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

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

即。它与控制器无关。

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

答案 2 :(得分: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>