我使用以下方法创建了一个ScalaJS项目:
http://www.scala-js.org/doc/tutorial.html
在http://www.scala-js.org/doc/faq.html阅读文档时,似乎没有描述创建和调用JavaScript函数?
如何创建JavaScript函数并调用它?
我手动将d3添加到head.html的头元素:
<head>
<script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script>
</head>
但是如何使用ScalaJS创建以下代码?
$(document).ready(function () {
var svgContainer = d3.select("body").append("svg")
.attr("width", 1200)
.attr("height", 1200)
.attr("text-align", "center");
testFunction(svgContainer);
});
<script>
function testFunction(svgContainer) {
alert(svgContainer)
}
</script>
整个index.html:
<!DOCTYPE html>
<html>
<head>
<title>Example Scala.js application</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
</head>
<body>
<h1>Example Scala.js application - full-optimized version</h1>
<p>After having compiled and full-optimized properly the code for the application
(using `sbt fullOptJS`), you should see "It works" herebelow.
See README.md for detailed explanations.</p>
<div id="playground">
</div>
<script type="text/javascript" src="./target/scala-2.10/my-project-fastopt.js"></script>
<script type="text/javascript" src="./target/scala-2.10/my-project-launcher.js"></script>
</body>
</html>
更新:
object ScalaJSExample extends js.JSApp {
def main(): Unit = {
jQuery(dom.document).ready { () => {
val svgContainer = "d3.select(\"body\").append(\"svg\").attr(\"width\", 1200).attr(\"height\", 1200).attr(\"text-align\", \"center\")";
val function = "callFunction(svgContainer)";
}
}
}
def callFunction(svgContainer): Unit = {
}
}
在callFunction
中输入svgContainer时,使用callFunction
构建时,fastOptJS
是否会创建为JavaScript函数?
在jQuery(dom.document).ready {
内,这是创建svgContainer
和testFunction
的正确方法吗?
答案 0 :(得分:6)
在Scala.js中,scala.FunctionN
可以隐式转换为js.FunctionN
并返回,所以你基本上不需要做任何事情:只需将lambda传入JavaScript调用即可。在“Scala.js中的设置UI”下有一个in Step 5 of the the tutorial的示例。对于您的代码,它看起来像这样:
jQuery(dom.document).ready { () =>
val svgContainer = ...
}
中找到有关此内容的更多信息
<强>更新强>
以下是整个JavaScript代码段的翻译:
import scala.scalajs.js
import org.scalajs.dom // see https://github.com/scala-js/scala-js-dom
import org.scalajs.jquery.jQuery // see https://github.com/scala-js/scala-js-jquery
object ScalaJSExample extends js.JSApp {
val d3 = js.Dynamic.global.d3 // assuming you don't have static types for d3, here
def main(): Unit = {
jQuery(dom.document).ready { () =>
val svgContainer =
d3.select("body").append("svg")
.attr("width", 1200)
.attr("height", 1200)
.attr("text-align", "center")
testFunction(svgContainer)
}
}
def testFunction(svgContainer: js.Dynamic): Unit = {
dom.alert(svgContainer.toString())
}
}
如你所见:
ready()
,dom.document
和dom.alert
。js.Dynamic
以动态类型的方式操作JavaScript值,使用普通语法(不是字符串)def
定义函数。你是否编译为JavaScript函数对你来说无关紧要:只需编写你的Scala代码而不考虑它,编译器就能完成它的工作。