在Scala.js中动态调用JavaScript

use*_*074 5 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")
 }
}
Run Code Online (Sandbox Code Playgroud)

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

sjr*_*jrd 6

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

但是要从<input>标签中读取它,你会做类似的事情:

def main(): Unit = {
  val msg = jQuery("#myinput").value()
  appendPar(msg)
}
Run Code Online (Sandbox Code Playgroud)

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

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

编辑:

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

首先,让您的服务器在生成的HTML var中的<script>标记中生成数据作为全局数据.就像是:

<script type="text/javascript">
var mydata = {
  msg: "Some text generated dynamically by the server"
}
</script>
Run Code Online (Sandbox Code Playgroud)

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

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

import scala.scalajs.js

val mydata = js.Dynamic.global.mydata
val msg = mydata.msg.asInstanceOf[String]
Run Code Online (Sandbox Code Playgroud)

如果您的数据始终是一个相对静态的结构,那么为它们声明一个外观类型可能会很有用:

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

然后您无需借助DynamicAPI 即可访问它:

val msg = MyData.msg
Run Code Online (Sandbox Code Playgroud)