我正在尝试从scala.js调用jquery。我尝试过修改jquery库的实现方式,但到目前为止没有成功。因此,我定义了以下特性和包对象:
trait JQueryUI extends js.Object {
def apply(selector: String): JQueryUI = ???
val buttonset: js.Any = ???
}
package object jqueryui extends js.GlobalScope {
val jQueryUI: JQueryUI = ???
}然后添加一个JSApp如下:
object JQueryUIApp extends JSApp {
def main(): Unit = {
jqueryui.jQueryUI("#sports").buttonset
}
}但是,在我的JavaScript控制台上,我得到了以下错误:
TypeError: ScalaJS.g"jQueryUI“不是函数(0,ScalaJS.g”jQueryUI“)(”#体育“)”扣式“
谁能告诉我我错过了什么吗?
发布于 2015-01-21 12:15:34
通过在包对象中声明类似的val jQueryUI,可以告诉Scala.js这对应于JavaScript中的一个名为jQueryUI的全局变量。这不是真的:您要寻找的实际变量名为jQuery。您可以通过使用@JSName显式命名值来解决这一问题。
import scala.scalajs.js.annotation.JSName
package object jqueryui extends js.GlobalScope {
@JSName("jQuery")
val jQueryUI: JQueryUI = ???
}但是,由于jQuery实际上是jQuery对象的扩展,所以我将使用扩展方法来定义scalajs-jquery的JQuery特性。这将允许对这两种用法(jQuery方法和jQuery方法)使用普通的jQuery。一般机制在呼叫JavaScript指南中被解释为“猴子修补”。在你的例子中,它看起来是这样的:
trait JQueryUI extends JQuery {
val buttonset: js.Any = ???
}
object JQueryUI {
implicit def jQueryUIExtensions(query: JQuery): JQueryUI =
query.asInstanceOf[JQueryUI]
}使用这些定义,您可以:
import org.scalajs.jquery._
import JQueryUI.jQueryUIExtensions
def main(): Unit = {
jQuery("#sports").buttonset
}注意,我使用的是普通的jquery.jQuery对象,它返回一个普通的JQuery对象,然后调用buttonset值,这个值是在JQueryUI中定义的。这是因为隐式转换jQueryUIExtensions的缘故。
https://stackoverflow.com/questions/28065804
复制相似问题