播放框架Twirl模板比较javascript元素和scala变量

时间:2016-08-26 01:46:59

标签: javascript scala playframework

如下面的代码示例所示,我想比较一个scala帮助元素中的javascript元素。但是,即使存在元素“abcde”,它也始终返回false。除了使用标签之外,如何在scala助手元素中获取javascript值?

@(appSeq:Seq(String))
<script>
var app = 'abcde'
@if(appSeq.contains(<script>app</script>)) {
   alert('true');
} else {
   alert('false');
}
</script>

2 个答案:

答案 0 :(得分:3)

这是不可能的:

  • var app = 'abcde'在JS VM中进行评估
  • 在Java VM
  • 中评估XML文本<script>app</script>)

因此,由于它们是两个不同的上下文,因此您无法共享从JS到Scala的变量。你可以做的是将一个变量从Scala传递给JS,因为Scala代码首先被评估,所有的值都将在模板中呈现。

您需要在Scala XML中硬编码'abcde'或更好地将其分配给Scala值,如:

@(appSeq:Seq(String))
@app="abcde"
<script>
var app = "@app"
@if(appSeq.contains(<script>$app</script>)) {
   alert('true');
} else {
   alert('false');
}
</script>

答案 1 :(得分:0)

你的问题不是很清楚,但在scala中使用javascript变量是不可能的。视图已编译,然后您将一些变量传递给此视图,因此播放/旋转将其呈现为http响应。在此之后,您处于前端区域,根本没有scala。

因此,最好在前端移动逻辑。如果您只想包含一次检查,那么您可以像这样完成它;

@(appSeq:Seq[String], app: String)
<script>
var app = "@app"

@if(appSeq.contains(s"<script>$app</script>")) {
alert('true');
} else {
alert('false');
}
</script>

但是如果你想这样做,可以在前端再次检查。最好将appSeq作为javascript数组传递到前端,并将javascript包含在javascript对象上。

这是在js中解释contain for array的链接。