【问题标题】:Play framework Twirl template comparing javascript element and scala variable播放框架 Twirl 模板比较 javascript 元素和 scala 变量
【发布时间】:2016-08-26 01:46:59
【问题描述】:
如下面的代码示例所示,我想比较一个 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>
【问题讨论】:
标签:
javascript
scala
playframework
【解决方案1】:
因为这个原因是不可能的:
-
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>
【解决方案2】:
你的问题不是很清楚,但在 scala 中使用 javascript 变量是不可能的。视图已编译,然后您将一些变量传递给此视图,结果 play/twirl 将其呈现为 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的链接。