1)我想将AngularJS与Play Framework 2.1.0结合使用,将Play服务JSON内容作为RESTful服务器后端,它从版本1.x迁移到2.x后就不可能了服务器静态HTML内容来自使用以下方法的Public文件夹:
Routes.conf:
GET / staticFile:/public/index.html
这会导致 Controller方法调用期望异常被引发。
我发现在Play 2.1.0中工作的一种方法是在Controller中编写一个Action方法,如下所示:
public static Result index() {
return ok(Play.application().getFile("public/index.html"));
}
这是最好的方法还是有更优雅和功能性的解决方案?
2)对于使用客户端JavaScript框架而不是基于Scala的模板引擎的方法,是否存在任何潜在的缺点或“陷阱”?
任何指针都会非常感激。
答案 0 :(得分:5)
使用Angular路由时的一种方法是使用Play为您的索引页提供服务,并将部分作为公共目录中的静态资源提供。 routes
文件将包含以下内容:
GET / controllers.Application.index
GET /assets/*file controllers.Assets.at(path="/public", file)
Play控制器看起来像:
def index = Action {
Ok(views.html.index())
}
这允许您使用Plays模板进行资源导入(它也适用于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>
然后你可以将所有部分放在公共目录中并将它们作为静态文件提供,这些可以从你的app.js中引用,如下所示:
when('/partial-1', {templateUrl: '/assets/partials/partial-1.html', controller: CtrlPartial1}).
答案 1 :(得分: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?*/));
}
我喜欢将客户端视图用于客户端生成的东西,并使用服务器端视图来准备字段,注入应在整个应用程序生命周期内使用的所有相关数据。
答案 2 :(得分:1)
最终种子(https://github.com/angyjoe/eventual)完美地提供public
文件夹中的静态HTML页面,同时使Play routes
脚本文件几乎完好无损。
种子最少使用Play Scala模板,以便为HTML中的AngularJS指令腾出空间。