我搜索了很多这个问题。我只想在scala html模板中创建一个变量,并需要一个临时变量。
我找到的唯一解决方案是“有意义”,如下所示:
@defining("hello text") {testvariable =>
<h1>output of variable: @testvariable</h1>
}
这真的是唯一的方法吗?来自playframework的人是否认真?我不想将控制器中的变量值传递给模板。我只想创建一个本地简单变量并在“if-block”中为其赋值,而不是其他。
答案 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>