使用Play框架模板中的Scala List填充Javascript数组

时间:2014-06-27 19:43:25

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

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

  

@(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;

      }

当我运行它时,我收到错误&#34;未找到:值i&#34;。这是因为i是客户端变量,而actions是服务器端变量,因此scala找不到i。解决这个问题并成功填充阵列的最佳方法是什么?

1 个答案:

答案 0 :(得分:3)

您需要为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