在Scala.js中动态调用JavaScript

时间:2015-01-21 14:25:53

标签: scala scala.js

我想知道如何在Scala.js中进行动态操作。例如,查看教程中的jQuery示例,我的理解是您在scala中定义以下内容:

object TutorialApp extends JSApp {
  def appendPar(msg: String) = {
    jQuery("body").append("<p>" + msg + "</p>")
  }
  def main(): Unit = {
    appendPar("Hello World")
 }
}

这是在编译时静态生成的所有内容。但我没有看到任何可以动态设置消息参数的方法(例如从数据库中读取)。

2 个答案:

答案 0 :(得分:6)

我不知道从数据库中读取它。这超出了这个问题的范围(或者你需要重新解释这个问题)。也许是一个AJAX电话或什么?

但要从<input>标签中读取它,您可以这样做:

def main(): Unit = {
  val msg = jQuery("#myinput").value()
  appendPar(msg)
}

(虽然在这种情况下,它可能在方法中没有任何意义,但这不是重点。)

我的意思是,msg只是val(就像JS中的var一样,但是不可变)。您可以根据需要从任何动态信息源中获取它。

修改

如果要在呈现页面时访问服务器动态生成的某些数据,可以这样做:

首先,让您的服务器在生成的HTML中的var标记中生成数据作为全局<script>。类似的东西:

<script type="text/javascript">
var mydata = {
  msg: "Some text generated dynamically by the server"
}
</script>

确保在调用Scala.js的main()函数之前发出此脚本标记

然后,从Scala.js,您可以使用js.Dynamic界面访问这些数据:

import scala.scalajs.js

val mydata = js.Dynamic.global.mydata
val msg = mydata.msg.asInstanceOf[String]

如果您的数据始终是一个相对静态的结构,那么为它们声明自己a facade type可能会很有用:

@JSName("mydata")
object MyData extends js.Object {
  val msg: String = ???
}

然后您可以访问它而无需使用Dynamic API:

val msg = MyData.msg

答案 1 :(得分:3)

添加(并尝试概括)sjrd's answer:要在javaScriptMethod的对象上调用JavaScriptType,您首先要为其type facade写一个:{/ p >

import scala.scalajs.js
import scala.scalajs.js.annotation.JSName

@js.native
@JSName("JavaScriptType")
class MyType() extends js.Object {
  def javaScriptMethod(someParam: String) = js.native
}

在那之后,在客户端使用Scala使用JavaScript代码是件小事:

val myObject = new MyType()
myObject.javaScriptMethod("Yippie")

作为一个具体示例,要在Scala.js应用程序中使用Stack Overflow的Markdown转换器Pagedown,您首先要为它创建类型Facade:

@js.native
@JSName("Markdown.Converter")
class MarkdownConverter() extends js.Object {
  def makeHtml(txtUsingMarkdown: String): String = js.native
}

如果您正在使用this great tutorial project学习Scala.js,则可以在Pagedown中声明对Settings.scala的依赖关系,如下所示:

val jsDependencies = Def.setting(Seq(
  "org.webjars.bower" % "pagedown" % "1.1.0" / "Markdown.Converter.js",
  //...

然后你可以简单地做

val html = new MarkdownConverter().makeHtml("this is *nice*")

这是我们称之为SparkMD5的静态方法的另一个例子。

我们定义object而不是前一个示例的class。此外,我们可以省略@JSName注释,因为我们的Scala类型与JavaScript类型同名:

@js.native
object SparkMD5 extends js.Object {
  def hash(str: String, raw: Boolean = false): String = js.native
}