2016-08-26 31 views
1

如下面的代碼示例所示,我想比較一個scala幫助器元素中的JavaScript元素。但即使存在元素「abcde」,它也總是返回false。我如何獲得除了使用標籤之外的scala幫助器元素中的javascript值?播放框架比較JavaScript元素和Scala變量的轉動模板

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

回答

3

不可能因爲這個原因:

  • var app = 'abcde'在JS VM評估
  • 文字<script>app</script>)在Java VM

評估於是,因爲它們是兩個不同的XML上下文無法從JS共享變量到Scala。你可以做的是將一個變量從Scala傳遞給JS,因爲Scala代碼首先被評估,並且所有的值都將被呈現在模板中。

您需要用硬編碼'abcde'在斯卡拉XML或更好的將其分配給Scala的值,如:

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

你的問題不太清楚,但在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