【问题标题】:Send a request to an Office add-in向 Office 加载项发送请求
【发布时间】:2017-03-15 10:06:20
【问题描述】:

我正在使用JavaScript API for Excel 制作 Excel 插件。插件入口为addin.html,调用JS、CSS文件。所有文件都托管在www.myexample.com

当我们点击插件中的一个按钮时,它会弹出一个window.open("https://www.myexample.com/post/", "popup")的浏览器窗口。以post.html为模板的页面由angularjsui-router构建。服务器和客户端也托管在www.myexample.com

post.html 的控制器需要不定时向addin.html 发送请求。例如,post.htmladdin.html 发送地址A1,并期望收到Cell A1 的当前值。 addin.html 很容易通过 JavaScript API for Excel 从 Excel 使用一些异步函数 获取单元格值。而我的问题是如何在post.html 的控制器中实现请求(从地址获取单元格值)。

如果我们使用$http.post,是否可以向没有服务器的addin.html发送请求?

var getValue = function (address) {
    return $http.post('...', { address: address })
        .then(function (res) {
             // maybe do something with res
             return res
        }
}

如果我们使用postMessage,我们可以在post.html 中实现监听器,它们是反应式的。我无法想象如何主动发送请求并等待响应。

有人可以帮忙吗?

【问题讨论】:

    标签: javascript http-post ms-office office-js postmessage


    【解决方案1】:

    当我们单击插件中的按钮时,您可以创建一个 DispalyDialog 并打开它,而不是打开一个窗口。从那里您可以使用messageParent() 方法向插件发送请求。为了处理收到的消息,你可以做类似的事情

    Office.context.document.addHandlerAsync(Office.EventType.DialogMessageReceived, myHandler);
    
    function myHandler(eventArgs) {
     //Do some processing
    }
    

    处理完成后,您可以将结果存储在localStorage 中,以便在DisplayDialog 中可用。

    这不是完成您需要的明确方法,但我相信它会完成任务。如果您发现任何其他解决方案,请在此处更新。

    【讨论】:

    • 很高兴知道Dialog...谢谢...
    【解决方案2】:

    如果我们按照 OP 中的描述通过window.open 打开弹窗浏览器,我们可以通过postMessage 在弹窗和加载项之间发送数据。

    如果我们打开@MohamedShakeel 建议的对话框,我们可以通过messageParentlocalStorage 发送数据。

    这两种方式都有效。

    我无法想象如何主动发送请求并等待 回应。

    我们可以通过手动做出类似here 的承诺来等待响应,例如来自加载项的消息。因此,我们将能够定义

    var getValue = function (address) {
        return sendRequestByPostMessage()
            .then(function () {
                 return waitForResponse()
                     .then(function (res) {
                         // treatTheResponse
                     })
            })
    }
    

    【讨论】:

      猜你喜欢
      • 2017-12-31
      • 2021-11-05
      • 2021-05-29
      • 2013-12-13
      • 2014-08-04
      • 2012-08-25
      • 2012-08-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多