2013-04-02 70 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指令的空间。