2014-11-05 40 views
6

我想有一個播放模板是一個JS文件(而不是有一個HTML模板中的<script>標籤)。這樣做的原因是腳本可以被緩存。但是,我需要在腳本中創建差異,具體取決於它包含的位置,並希望通過Play的模板系統執行此操作。如果我使用嵌入式腳本,我已經可以這樣做了,但是這些腳本不能被緩存。玩框架模板,實際上是一個JS文件

我發現an existing question也要求同樣的事情,但答案是完全不同的(不同的目標)。

+0

您可以定義JavaScript文件的播放模板。就像你爲html模板做的一樣。您只需添加模板並從控制器中渲染它並添加路由。但總是有比創建動態JavaScript更好的方法。至於緩存,如果您創建一個正常的JavaScript文件並通過播放進行播放,該怎麼辦?你認爲它不會被緩存?爲什麼? – 2014-11-05 06:17:37

+0

@NaderHadjiGhanbari,我沒有說一個正常的JS文件不會被緩存。相反,我需要能夠使用Play將數據替換爲文件並提供實際的JS文件,而不是嵌入的JS代碼(在HTML中)。 – Mike 2014-11-06 17:16:20

回答

15

這很簡單,只是...創建視圖與.js擴展,即:views/myDynamicScript.scala.js

def myDynamicScript = Action { 
    Ok(views.js.myDynamicScript.render(Hello Scala!")).as("text/javascript utf-8") 
} 

@(message: String) 

alert('@message'); 

//Rest of your javascript... 

所以,你可以用斯卡拉行動使它Java action:

public static Result myDynamicScript() { 
    return ok(views.js.myDynamicScript.render("Hello Java!")); 
} 

創建route到你的行動(可能你會想一些PARAMS添加到它):

GET /my-dynamic-script.js  controllers.Application.myDynamicScript() 

所以,你可以將其包含在HTML templite,就像:

<script type='text/javascript' src='@routes.Application.myDynamicScript()'></script> 

可選:

您也可以將腳本渲染到您的HTML文檔中,即將其放置在您的<head>...</head>部分中:

<script type='text/javascript'> 
    @Html(views.js.myDynamicScript.render("Find me in the head section of HTML doc!").toString()) 
</script> 

編輯:@See also samples for other templates types

+0

我討厭這聽起來像一個「我也是」謝謝,但是,這實際上解決了一個**完全不同的問題**我玩的SBT子模塊設置與靜態資產。我現在不再需要解決這個問題了,因爲這是我需要解決的挑戰。所以謝謝 :) – Techmag 2015-11-18 15:55:48