Scala code in JavaScript using Scala's '@'
Scala code in JavaScript using Scala's '@'
我正在使用带有Scala和Mongo的Playframework。我有一个scala.html
文件,它具有以下参数
@(pageData:Map[String,Any], dairyData:Map[String,Any])
dairyData映射包含一个日期和该日期的6行数据点。
我还有一个JavaScript文件,它在同一文件中使用谷歌的折线图
<script type="text/javascript">
google.load('visualization', '1.1', {packages: ['line']});
//google.setOnLoadCallback(drawChart);
function drawChart() {
var data = new google.visualization.DataTable();
data.addColumn('number', 'Dag');
data.addColumn('number', 'Pijn');
data.addColumn('number', 'Stemming');
data.addColumn('number', 'Slaap');
data.addRows([
[1, 1.0, 80.8, 41.8],
[2, 30.9, 69.5, 32.4],
[3, 25.4, 57, 25.7],
[4, 11.7, 18.8, 10.5],
[5, 11.9, 17.6, 10.4],
[6, 8.8, 13.6, 7.7],
[7, 7.6, 12.3, 9.6],
[8, 12.3, 29.2, 10.6],
[9, 16.9, 42.9, 14.8]
]);
var options = {
chart: {
},
width: 900,
height: 480
};
var chart = new google.charts.Line(document.getElementById('linechart_material'));
chart.draw(data, options);
}
</script>
JavaScript折线图现在显示3行,分别称为Pijn、Stemming和Slaap,其中包含9天的数据。
还有一个div,它现在显示折线图和我想在图表中显示的数据。
<div style="width: 1000px; height: 500px;" id="linechart_material">
@if(dairyData.get("0")!=None) {
@for((dairyPool,i) <- dairyData.asInstanceOf[Map[String,Any]].toArray.zipWithIndex){
<p>@dairyData.get(dairyPool._1).get.asInstanceOf[Map[String,Any]]</p>
}
}
</div>
我的问题是,如何用Scala映射中的数据填充用JavaScript绘制的折线图JavaScript似乎不适用于Scala的"@"
我想使用JavaScript折线图,因为所有Java/Scala折线图看起来都很难看。但如果你有另一种方法,我也想听听他们的意见。
选项1:直接嵌入
如注释中所示,您可以将Scala值转换为JsValue
,然后转换为String,然后将其与@Html
一起放置在页面中,并将其分配给JavaScript变量。
控制器:
Ok(views.html.demo.show(Json.toJson(users).toString()))
视图:
@(users: String)
[...]
<script type="application/javascript">
var users = @Html(users);
</script>
选项2:单独获取数据
还有另一种方法:
- 页面仅呈现页面布局(无数据)
- 加载页面后,JavaScript函数使用AJAX请求单独提取数据
- 然后使用响应中的数据填充图表
这个场景需要更多的设置,但它提供了更好的分离:页面布局(HTML页面)、JavaScript(功能,在一个单独的文件中)和数据之间有所不同。
优点:
一个"更新"按钮也可以:使用AJAX提取数据,然后刷新图表。它不需要重新加载整页。
您可以将"仅数据"JSON用于其他目的(在其他页面等)-它不局限于图表页面。
返回JSON的函数可以单独测试
一些示例片段:
在控制器中:提供一种以JSON形式返回数据的方法:
implicit val userFormat = Json.format[User]
private def getUsers() = {
List(
User(0, "root"),
User(1, "jim"))
}
def get = {
Action {
request =>
val users = getUsers()
Ok(Json.toJson(users))
}
}
在JavaScript中(我在这里使用jQuery):提供一个执行AJAX调用的update()
函数,并在ready()
中使用该函数进行初始显示。这个功能也可以绑定到一个按钮上:
function update() {
$.ajax({
url: "/demo/get",
method: "GET",
contentType: "application/json; charset=UTF-8",
dataType: "json",
success: function(response, textStatus, jqXHR) {
// Populate chart using the data in the response
},
});
}
$(document).ready(function() {
$("#updateButton").click(function() {
update();
});
update();
});
- 如何从Java/scala调用js美化程序
- 如何通过引用var Using DataTables来进行分页或排序
- 使用Scala Play Framework视图中的键检索映射值
- Object.prototype using 'this'
- using LocalStorage ionic 2
- jQuery Replacing, Using arrays
- 避免在来自HTML的Scala.js调用中重复包名称
- Using jQuery with classes from ES6
- Dropdownlist using javascript
- 在scala或scalajs Diode中,现有类型中的任何一种都符合“;更新一个没有'还不存在”;
- Tic-Tac-Toe using React JS
- 在jqueryui中更改关键字using
- Using php mktime()
- Twitter api using Javascript
- Bootstrap-Datepicker not selecting date when using "set
- fetch data from db using javascript & php
- Scala提升了如何运行javascript函数并将返回值存储在变量中
- Using closures in node js
- googleTagManager using JQueryMobile
- Scala code in JavaScript using Scala's '@'