【问题标题】:Access Javascript objects imported by url in html访问 html 中 url 导入的 Javascript 对象
【发布时间】:2018-03-08 09:19:33
【问题描述】:

我正在编写一个嵌入式应用程序,我在其中使用 Office 365 库来访问通过全局对象 Office

向我的应用程序公开的 Outlook 电子邮件上下文

我已经编写了 javascript 应用程序,其中我在 html 页面中包含了脚本 url,如下所示:

<script type="text/javascript" src="https://appsforoffice.microsoft.com/lib/1/hosted/office.js"></script>

在我访问 ES6 javascript 函数中的上下文后,如下所示:

 Office.initialize = function (reason) {
            $(document).ready(function () { 
                 Office.context.mailbox.addHandlerAsync(Office.EventType.ItemChanged, callbackfunction);
            });
        };

我想在 scala JS 中做同样的事情。

对于包含在 html 中的 Office js 库,如上所述。

在尝试访问 Office 对象后:

@js.native
@JSGlobal
object Office extends js.Any {
  def initialize(f: String => Unit):js.Any = js.native
}

当我调用这个 Office 对象时,它会抛出错误。

def callback = (reason:String) => {
  println(s"reason called in callback function => $reason")
}
Office.initialize(callback)

如何在 scala JS 中实例化和访问 office 对象?

错误:

VM3981 playground-fastopt-bundle.js:4078 Uncaught TypeError: $g.Office.initialize is not a function
    at HTMLDocument.<anonymous> (VM3981 playground-fastopt-bundle.js:4078)
    at mightThrow (VM4209 playground-fastopt-bundle.js:25770)
    at process (VM4209 playground-fastopt-bundle.js:25838)

初始化在 Office 对象中不可用。我们必须在运行时加载函数。 错误信息:

在 Office.initialize 函数中添加您的初始化代码。

代码要点: https://gist.github.com/rajeevprasanna/8d4f193bc328f2c2d48e113960fb25a6

【问题讨论】:

  • 到底抛出了什么错误?此外,您说您“想在 Scala.js 中做同样的事情”,但 Scala.js sn-p 据称 调用 initialize,而 JS sn-p 定义initialize。你想做的是哪一个?如果要调用它,它是在哪里定义的?
  • 我想调用初始化函数来初始化 office 上下文对象以访问 office 对象上可用的字段。

标签: scala.js binding.scala


【解决方案1】:

我不确定

Office.initialize = { r:String =>
    println(s"function initialized. reason => $r")
  }

代码是否有效但我写了一个小例子,它运行良好。 看看https://gist.github.com/abdheshkumar/f2ef0c73b942a8f5a48ec20559679105

【讨论】:

    【解决方案2】:

    我通过以下方法解决了这个问题:

    根据错误消息在 Office.initialize 函数中添加您的初始化代码,我必须定义一个属性来加载该函数。

    @js.native
    @JSGlobal
    object Office extends js.Object {
      var initialize:js.Function1[String, _] = js.native
    }
    

    加载上述函数后:

    Office.initialize = { r:String =>
            println(s"function initialized. reason => $r")
          }
    

    这种方法类似于按钮点击的事件处理。

    参考:https://github.com/scala-js/scala-js-dom/blob/5adf7290a4b1fdf7759dfed120e4050f87d9f0a2/src/main/scala/org/scalajs/dom/raw/Html.scala#L416

    【讨论】:

      【解决方案3】:

      鉴于该错误,似乎在您尝试调用 Office.initialize 函数时尚未创建它。 Office 对象存在,但它没有字段 initialize(或者它不是函数)。

      这可能只是因为您的script 标签的顺序不正确。确保应该定义 Office.initialize 的脚本在 Scala.js 代码之前执行

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-11
      • 1970-01-01
      • 2012-08-31
      • 2018-09-27
      • 2016-01-31
      • 1970-01-01
      相关资源
      最近更新 更多