2013-04-02 75 views
6

1)我想使用帶有Play Framework 2.1.0的AngularJS,Play將JSON內容作爲RESTful服務器後端服務,它出現在從版本1.x移動到2.X是不可能到服務器的靜態HTML內容使用下面的方法公用文件夾說:Play Framework 2.1.0和AngularJS集成

Routes.conf:

GET /       staticFile:/public/index.html 

這導致控制器方法調用有望被提出例外。

我已經找到了一種方法,在播放2.1.0工作原理是在一個控制器寫入的操作方法,如下面:

public static Result index() { 
    return ok(Play.application().getFile("public/index.html")); 
} 

這是最好的辦法,還是有更優雅和實用的解決方案對此?

2)在這種使用客戶端JavaScript框架而不是基於Scala的模板引擎的方法中,是否存在潛在的缺點或「陷阱」?

任何指針將不勝感激。

+0

爲什麼會失敗?它不應該... –

回答

2

當文件位於public文件夾中時,只需使用/assets/*網址即可訪問它們。你也可以做這樣的事情:

GET /view/*file  controllers.Assets.at(path="/public/angular", file) 

Morover,我會說,即使是靜態的,你可以想在未來的動態生成的一些數據。 因此,您可以簡單地將HTML文件創建爲經典模板,例如:ang/index.scala.html。然後,你的路線,控制器會看起來像:

路線:

GET / controllers.Application.angView() 

控制器:

public static Result index() { 
    return ok(views.html.ang.index(/*some data here?*/)); 
} 

我喜歡用客戶端的觀點爲客戶端生成的東西,和服務器 - 準備田間的意見,注入應用整個應用過程中使用的所有相關數據。

5

使用Angular路線時的一種方法是使用Play服務您的索引頁面,並將該部分作爲靜態資源從公共目錄中提供。該routes文件將具有以下內容:

GET  /        controllers.Application.index 
GET   /assets/*file     controllers.Assets.at(path="/public", file) 

隨着播放器看起來像:

def index = Action { 
    Ok(views.html.index()) 
    } 

這使您可以使用播放模板做你的資源進口(這也與WebJars很好地工作) 。例如,在您的index.scala.html

<script src="@routes.Assets.at("javascripts/app.js")" type="text/javascript"></script> 
<script type='text/javascript' src='@routes.WebJarAssets.at(WebJarAssets.locate("angular.min.js"))'></script> 

然後你就可以把你所有的泛音在公共目錄中,爲他們提供服務的靜態文件,這些都可以從你的應用程序中引用。JS像這樣:

 when('/partial-1', {templateUrl: '/assets/partials/partial-1.html', controller: CtrlPartial1}). 
1

最終的種子(https://github.com/angyjoe/eventual)完美地供應來自public文件夾靜態的HTML頁面,同時使播放routes腳本文件幾乎完好無損。

種子使Play Scala模板的使用最少,以清除HTML中AngularJS指令的空間。