2017-03-09 109 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