如何使用Scala.js创建一个javascript函数?

时间:2014-12-07 12:59:38

标签: javascript scala d3.js scala.js

我使用以下方法创建了一个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 {内,这是创建svgContainertestFunction的正确方法吗?

1 个答案:

答案 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 = ...
}

您可以在calling JavaScript guide

中找到有关此内容的更多信息

<强>更新

以下是整个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())
  }
}

如你所见:

  1. 对于具有Scala.js静态类型的库(例如,DOM和jQuery),最好使用这些静态类型。以静态类型方式使用ready()dom.documentdom.alert
  2. 如果没有静态类型,可以使用js.Dynamic以动态类型的方式操作JavaScript值,使用普通语法(不是字符串)
  3. 您使用def定义函数。你是否编译为JavaScript函数对你来说无关紧要:只需编写你的Scala代码而不考虑它,编译器就能完成它的工作。