scala.js jquery facade 通过触发器发送数据

scala.js jquery facade send data through trigger and on

如何使用 scala.js jquery facade 和触发器发送数据?

例如

$(dom.document).trigger("my-event", someData)

$(dom.document).on("my-event", (someData: ???) => {
   println(someData)
})

我承认,我认为我自己从未使用过 trigger 的数据发送版本——您应该参考 the jQuery documentation 了解如何使用它的详细信息。所以这有点推测,您可能需要做一些实验。

也就是说,在 Scala 方面,签名主要说明了一切:

def trigger(eventType:String, extraParameters:Any*):JQuery = js.native
def on(events:String, handler: js.Function2[JQueryEventObject, Any, Any]): JQuery = js.native

trigger() 可以接受任何数据参数,它将被传递到 on() as Any 的处理程序中。此版本的 on() 签名也需要 JQueryEventObject。 (请注意,顺便说一句,还有一个用于将两个数据字段传递到 on() 的签名。我懒得写两个以上;如果有人需要的话,那是 reader 的练习.)

另请注意,由于 on() 的签名有点奇怪,它不能使用 jquery-facade 的 EventHandler 类型,它为自动转换 Scala 提供了魔法函数转换为 JS 函数。例如,如果这个处理程序刚刚接收到一个 JQueryEventObject(就像大多数 jQuery 调用所做的那样),它将通过 jquery-facade 的 [=48= 中的这个函数变成一个 JS 函数]:

implicit def f12EventHandler(func:scala.Function1[JQueryEventObject, Any]):EventHandler = { func:js.Function1[JQueryEventObject, Any] }

由于 on() 的稀有数据接收版本没有标准版本,您必须手动指定调用类型,或者编写您自己的上述版本 implicit 对于这种情况。

所有这些意味着您上面的签名可能应该是:

$(dom.document).on("my-event", (evt:JQueryEventObject, someData: Any) => {
   println(someData)
}:js.Function2[JQueryEventObject, Any, Any])

然后如果你需要做一些比 println 更有趣的事情,你应该使用模式匹配将 someData 缩小到实际预期的类型。请注意,我还没有测试过这个,但我认为它应该可以工作。

是的,这在 DOM 界面上有点松散;这就是使用并非设计为强类型的 JS 库的现实。

希望这对您有所帮助...