播放框架2.在ajax回调中渲染模板

时间:2015-04-21 19:19:17

标签: playframework playframework-2.0 playframework-2.3

我有用于呈现评论的模板,comment.scala.html

@(date: String, text: String, name: String)
...
<h4>@name</h4>  
<p>@date</p>  
<div>@comment</div>

评论还添加了带有ajax的页面,sendcomment.js

$("#commentForm").submit(function () {
        jsRoutes.controllers.Posts.addComment($("#blogpostContainer").data("post-id")).ajax({
            success: function (data) {

              //here i populate data with js - my current solution
              var commentHtml = "<li><h4>" + data.name + ... +</li>"

              //but i want use comment template for populating data

                $("#commentsContainer").append(commentHtml);
                $('#commentForm').each(function () {
                    this.reset();
                });
            },
            error: function () {
                alert("Error!")
            },
            data: $("#commentForm").serialize()
        })
        return false;
    }
)

我知道,我不能将Scala变量(服务器端)与JS变量(客户端)混合在一起 我的问题 - 如何使用html模板渲染ajax回调?

2 个答案:

答案 0 :(得分:2)

要扩展@ Ryan的答案,在Scala表单中重用comment.scala.html的唯一方法是返回HTML而不是JSON。

<强>赞成

  • 代码重复使用
  • 类型安全

<强>缺点

  • 如果HTML的大小&gt;可能会增加带宽使用量。 JSON的大小)

为此,您的控制器方法将看起来像这样的伪代码,不包括错误检查等。我假设是Java,但Scala版本的逻辑是一样的。

public static F.Promise<Result> addComment() {
    return F.Promise.promise(() -> convert POST data to a comment object)
                    .map(comment -> comment.save())
                    .map(comment -> ok(comment.render(comment.date, 
                                                      comment.text,
                                                      comment.userName)));
}

您的JavaScript看起来像

$("#commentForm").submit(function () {
  jsRoutes.controllers.Posts.addComment($("#blogpostContainer").data("post-id")).ajax({
    success: function (data) {
      $("#commentsContainer").append(commentHtml);
      $('#commentForm').each(function () {
        this.reset();
      });
    },
    error: function () {
      alert("Error!")
    },
    data: $("#commentForm").serialize()
  })
  return false;
})

答案 1 :(得分:1)

就像变量一样,Scala模板也是渲染服务器端的。

你可以:

  1. 渲染HTML服务器端并在AJAX调用中返回
  2. 使用客户端模板库(有很多)