6

1) 我想将 AngularJS 与 Play Framework 2.1.0 一起使用,Play 将 JSON 内容作为 RESTful 服务器后端提供服务,自从从 1.x 版迁移到 2.x 版以来,似乎无法服务器静态 HTML使用以下方法从公共文件夹中获取内容:

路由.conf:

GET     /                           staticFile:/public/index.html

这会导致引发控制器方法调用预期异常。

我发现在 Play 2.1.0 中有效的一种方法是在 Controller 中编写一个 Action 方法,如下所示:

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

这是最好的方法还是有更优雅和更实用的解决方案?

2) 在这种使用客户端 JavaScript 框架而不是基于 Scala 的模板引擎的方法中是否有任何潜在的缺点或“陷阱”?

任何指针将不胜感激。

4

3 回答 3

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}).
于 2013-06-02T10:53:22.043 回答
2

当文件在public文件夹中时,您可以简单地使用/assets/*URL 访问它们。你也可以这样做:

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?*/));
}

我喜欢使用客户端视图来生成客户端生成的东西,并使用服务器端视图来准备字段,注入在整个应用程序生命周期中应该使用的所有相关数据。

于 2013-04-03T13:51:40.087 回答
1

最终的种子 ( https://github.com/angyjoe/eventual ) 完美地服务于文件夹中的静态 HTML 页面,public同时使 Playroutes脚本文件几乎完好无损。

种子最少使用 Play Scala 模板,以便为 HTML 中的 AngularJS 指令腾出空间。

于 2013-11-17T02:34:38.317 回答