我想知道如何在Scala.js中进行动态操作。例如,查看教程中的jQuery示例,我的理解是您在scala中定义以下内容:
object TutorialApp extends JSApp {
def appendPar(msg: String) = {
jQuery("body").append("<p>" + msg + "</p>")
}
def main(): Unit = {
appendPar("Hello World")
}
}
这是在编译时静态生成的所有内容。但我没有看到任何可以动态设置消息参数的方法(例如从数据库中读取)。
答案 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
}