【问题标题】:using scala.js method as callback使用 scala.js 方法作为回调
【发布时间】:2015-02-10 23:06:46
【问题描述】:

我正在以异步方式加载谷歌地图,

@JSExport("sample")
 object Sample {

  def loadScript = {
    val script = document.createElement("script").asInstanceOf[HTMLScriptElement]
    script.`type` = "text/javascript"
    //case 1
    script.src = "https://maps.googleapis.com/maps/api/js?v=3.exp&callback=sample().initialize"
    // case 2
    script.src = "https://maps.googleapis.com/maps/api/js?v=3.exp&callback=sample.initialize"
    document.body.appendChild(script)
  }

  @JSExport
  def initialize() :Unit  = {
     println(" map loaded successfully")
  }
}

如果 1 google 发送响应 - 400(错误请求)

如果 2 我得到未定义的函数 (window.sample.initialize())

我可以定义一个 javascript 函数,在该函数中我可以调用 sample().initialize() ,但是有什么更简洁的方法吗?

【问题讨论】:

  • 恕我直言,案例 1 应该是正确的。您确定这不仅仅是 URL 编码问题吗?
  • 没有 URL 编码问题,:host:maps.googleapis.com :method:GET :path:/maps/api/js?v=3.exp&callback=sample().initialize
  • 感谢您提出这个问题。仅供参考,我为此提交了一个问题:github.com/scala-js/scala-js/issues/1381

标签: scala.js


【解决方案1】:

这是一个老生常谈的答案,但作为一种解决方法可能很有用。

您可以直接给它模块初始化器,而不是给 Google API 提供与 Scala.js 函数相对应的东西:

object Sample {
  def loadScript = {
    val script = document.createElement("script").asInstanceOf[HTMLScriptElement]
    script.`type` = "text/javascript"
    script.src = "https://maps.googleapis.com/maps/api/js?v=3.exp&callback=initializeSample"
    document.body.appendChild(script)
  }
}

@JSExport("initializeSample")
object Initializer {
  println(" map loaded successfully")
}

【讨论】:

  • 谢谢,这绝对比创建 javascript 函数更好。
【解决方案2】:

我会使用 Scala.js 的动态 API 在顶层创建 JavaScript 函数。与@gzm0 的解决方案相比,它的优势在于它不那么hacky,并且需要的样板文件更少。

object Sample {
  def loadScript = {
    val script = document.createElement("script").asInstanceOf[HTMLScriptElement]
    script.`type` = "text/javascript"
    script.src = "https://maps.googleapis.com/maps/api/js?v=3.exp&callback=initializeSample"
    document.body.appendChild(script)

    js.Dynamic.global.initializeSample = initialize _
  }

  private def initialize(): Unit =
    println("map loaded successfully")
}

【讨论】:

猜你喜欢
  • 2012-11-12
  • 2014-04-21
  • 2018-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 2011-04-19
相关资源
最近更新 更多