2017-03-09 84 views
0

我正在制作一个Excel加载项JavaScript API for Excel。插件的输入是addin.html,它调用JS,CSS文件。所有文件托管在www.myexample.com向Office加载项发送请求

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

post.html的控制器需要不时发送请求到addin.html。例如,post.html发送地址A1addin.html,并期望收到Cell A1的当前值。 addin.html通过Excel 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

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

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

这两种方法都有效。

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

我们可以等待回复,例如来自加载项的消息,方法是手动提供像here这样的承诺。因此,我们将能够定义

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

当我们点击插件中的按钮时,不用打开窗口,您可以创建一个DispalyDialog并打开它。从那里你可以使用messageParent()方法向插件发送请求。为了处理收到的消息时,处理完成后,你可以不喜欢

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

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

,你可以把结果保存在localStorage使其在DisplayDialog可用。

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

+0

很高兴知道[Dialog](https://dev.office。com/docs/add-ins/develop/dialog-api-in-office-add-ins)...谢谢... – SoftTimur