向Office加载项

时间:2017-03-09 23:09:08

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

我正在使用JavaScript API for Excel制作Excel插件。 addin的条目是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.html将地址A1发送到addin.html,并期望接收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中实现哪些是被动的侦听器。我无法想象如何主动发送请求并等待响应。

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

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

的操作
Office.context.document.addHandlerAsync(Office.EventType.DialogMessageReceived, myHandler);

function myHandler(eventArgs) {
 //Do some processing
}

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

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

答案 1 :(得分:0)

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

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

这两种方式都有效。

  

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

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

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