我正在使用JavaScript API for Excel制作Excel插件。 addin的条目是addin.html
,它调用JS,CSS文件。所有文件都托管在www.myexample.com
。
当我们点击插件中的按钮时,它会弹出window.open("https://www.myexample.com/post/", "popup")
的浏览器窗口。以post.html
为模板的网页由angularjs
和ui-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
中实现哪些是被动的侦听器。我无法想象如何主动发送请求并等待响应。
有人可以帮忙吗?
答案 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建议的对话框,我们可以按messageParent
和localStorage
发送数据。
这两种方式都有效。
我无法想象如何主动发送请求并等待 响应。
我们可以通过手动制作here之类的承诺等待响应,例如来自加载项的消息。因此,我们将能够定义
var getValue = function (address) {
return sendRequestByPostMessage()
.then(function () {
return waitForResponse()
.then(function (res) {
// treatTheResponse
})
})
}