【问题标题】:Populate Javascript array using Scala List in Play framework template在 Play 框架模板中使用 Scala List 填充 Javascript 数组
【发布时间】:2014-06-28 04:03:28
【问题描述】:

好的,我在 Play 中有一个模板!接收一个列表作为参数:

@(actions : List[RecipientAction])

RecipientAction 只是一个带有几个字段的常规案例类。在模板中,我有一个<script> 标签,我想在其中使用D3 制作折线图。在脚本内部,我想用包含存储在 RecipientAction 中的属性的对象填充 JavaScript 数组,以便稍后将它们用于我的折线图。我目前有这个代码:

      testArray2=[];

      for(var i=0; i < @actions.length;i++){
        testArray2[i]= {};
        testArray2[i].eventAt= @actions(i).eventAt.toString();
        testArray2[i].action= @actions(i).action.id;

      }

当我运行它时,我收到错误“未找到:值 i”。这是因为i 是客户端变量,而actions 是服务器端变量,所以scala 找不到i。解决此问题并成功填充数组的最佳方法是什么?

【问题讨论】:

  • JSON 可能是正确的方法,但如果您想要更基本的东西,请查看here,其中第二个答案使用 mkString。需要注意字符串,包括引号等。

标签: javascript scala playframework client-side server-side


【解决方案1】:

您需要为您的RecipientAction 创建一个 JSON 序列化程序,然后您就可以在模板中将列表打印为 JSON。说它看起来像这样..

import play.api.libs.json._

case class RecipientAction(id: Int, description: String)

object RecipientAction {
     // Define a `Writes` for `RecipientAction`
     implicit val writes: Writes[RecipientAction] = Json.writes[RecipientAction]
}

我使用了 Play 中包含的一个 JSON 宏,它会自动为案例类创建 Writes,因为我们只关心打印列表。

然后在你的模板中:

@(actions : List[RecipientAction])
@import play.api.libs.json.Json

<script type="text/javascript">
    var testArray = @Html(Json.stringify(Json.toJson(actions)));
</script>

implicit Writes 的定义是必需的,以便Json.toJson 知道如何将类转换为 JSON。有关 Json 序列化/反序列化的更多信息,请参阅documentation

【讨论】:

    猜你喜欢
    • 2018-07-02
    • 2014-03-27
    • 1970-01-01
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-28
    相关资源
    最近更新 更多