如何将Java Map <long,integer =“”>传递给scala-play?

时间:2017-03-06 15:32:37

标签: javascript java scala playframework

在我的play框架项目中,我有一个确认的Java表格的函数Java映射,它传递给html页面home.scala.html

传递map变量,其他(工作)变量位于页面顶部:

@(workingVar1: String, workingVar2: Int, mapVar: Map[Long, Integer])

但谷歌浏览器中的开发者工具突出了javascript的这一部分(嵌入在home.scala.html&#39; s):

var myMap = @mapVar;

错误Uncaught SyntaxError: Unexpected token =

所以javascript都没有用。传递此地图的正确方法是什么?

2 个答案:

答案 0 :(得分:0)

您可以在Twirl Scala模板中使用Java / Scala变量,并且两者都在服务器端执行。 现在在服务器端,Twirl引擎将Java对象转换为某些东西(可能不是你想要的东西),并以这种形式传递给客户端,然后执行这个JavaScript。

您希望确保客户端将收到有效的JavaScript代码。 要分配适当的值,您必须混合一些JSON库,这将帮助您以适当的方式分配值。

EG。在控制器方面:

...
Map<Long, Integer> map = new HashMap<>();
map.put(1L, 2);
map.put(3L, 3);
String yourMap = Json.stringify(Json.toJson(map));

现在您要传递yourMap进行查看,然后您将分配到myMap 使用@Html,因为我们希望它作为原始内容片段:

@(workingVar1: String, workingVar2: Int, mapVar: String)
var myMap = @Html(mapVar);

尝试并告诉我它是否有帮助。

答案 1 :(得分:0)

一个不优雅但功能性的解决方案如下:

将Java Map作为字符串输入:

  var stringMap = "@mapVar";

不必要地删除插入字符串的大括号和空格

  stringMap = stringMap.replace(/{/g,'');
  stringMap = stringMap.replace(/}/g,'');
  stringMap = stringMap.replace(/ /g,'');

,拆分mapString,并按=再次拆分每一对,随时提取键和值。在添加到javascript数组jsArr之前,需要将它们解析为正确的数据类型:

  var pairArray = mapString.split(",");
  pairArray.forEach(function(pair) {
      var values = pair.split("=");
      var longString = values[0];
      var intString = values[1];
      var myLong = parseFloat(longString);
      var myInt = parseInt(intString);
      jsArr.myLong = myInt;
}

先前已定义过jsArr。