你知道Scala到Javascript DSL /编译器吗? 我想用Scala编写我的Javascript代码,所以我不必编写这么多的JS代码。 谢谢你的帮助!
答案 0 :(得分:7)
还有Scala-GWT项目。
答案 1 :(得分:6)
你可以尝试一下Lift的JsCmds和JqJsCmds(jquery)来看看它能支持你的需求。它在Lift-applications中非常有用(还没有回到原始的javascript)。
答案 2 :(得分:2)
那么,您可以将scala类反编译为java源代码,然后使用GWT编译反编译的java源代码..好吧,但是你应该知道GWT只支持JDK的一个子集。
答案 3 :(得分:2)
Reactive-web有一个非常完整,易于阅读的DSL,用于在Scala中编写Javascript。实际上DSL有两个部分:表达式和语句。
语句使用构建器DSL(在DSL中应用对象将实例放在可以收集的线程本地堆栈上)。如果将其括在Javascript { ... } block
中,则javascript将通过Lift webapp发送到浏览器。如果您只是想让它返回DSL对象,请将其括在val (_, theStatements) = JsStatement.inScope{ ... }
中。您可以将结果传递给String
。
JsStatement.render
以下是测试中的一些代码:
If(true) {
window.alert("True")
}.ElseIf (false){
window.alert("False")
} Else {
If(true) {
} Else {
}
}
While(true) {
window.alert("Again!")
}
Do {
window.alert("Hello!")
} While (false)
Switch(1)(
0.$ :> {
window.alert("No")
},
1.$ :> window.alert("Yes")
)
object i extends JsVar[JsNumber]
For(List(i := 1), i < 10, List(i := i + 1)) {}
Page.withPage(new Page){
for (j <- List(1.$, 2.$, 3.$)$) {
If(j > 1) {
window.alert("Greater"$)
}
}
for (j <- Each(List(1.$, 2.$, 3.$))) {
If(j > 1) {
window.alert("Greater")
}
}
Try {
Throw("message")
} Catch { c =>
} Finally {
}
}
object myFunc extends Function({ x: $[JsNumber] =>
If(x > 10) {
window alert "Greater"
} Else {
window alert "Small"
}
})
myFunc(10)
Page.withPage(new Page) {
val myFunc2 = Function({ x: $[JsNumber] => Return(x > 10) })
val myAjax = Ajax{ x: String => println("Got "+x) }
myAjax("Hello server!")
}
测试中的一些代码(请注意,虽然它目前使用$,但将来应该更改为更易读的内容):
(1.$ + 2 render) should equal (new JsOp(1, 2, "+").render)
{ () =>
If(true) {
window alert "Greater"
} Else {
window alert "Small"
}
}.$.render should equal (
"(function(){if(true) {window.alert(\"Greater\")} else {window.alert(\"Small\")};return })"
)
答案 4 :(得分:1)
有JScala - Scala宏将Scala代码转换为JavaScript。