2017-07-08 69 views
2

如果我們在Office客戶端以外加載引用office.js的網頁,我們將收到警告:Office.js is loaded outside of Office client檢查Office.js是否在Office客戶端以外加載

此信息有用。

有誰知道是否有一個API來檢查我的代碼裏面?

編輯1:

我解釋一下我的情況,爲什麼我問這個問題。我正在製作一個可以在瀏覽器中作爲網頁或在Office中作爲加載項加載的angularjs應用程序。我意識到我們不應該一起做<body ng-app="myApp">angular.bootstrap(document, ['myApp']),否則控制器將執行兩次。所以我決定不寫<body ng-app="myApp">並且在兩種情況下總是使用angular.bootstrap(即,網頁&加載項)。

因此,對於一個網頁,我可以這樣寫:

$(document).ready(function() { 
    angular.bootstrap(document, ['myApp']) 
}) 

app = angular.module('myApp', ['ui.router', 'ui.bootstrap']) 
... 

因此,對於一個網頁,我需要寫angular.bootstrapOffice.initialize,並用的情況下,分享其他代碼加載項:

Office.initialize = function (reason) { 
    $(document).ready(function() { 
     angular.bootstrap(document, ['myApp']) 
    }); 
} 

app = angular.module('myApp', ['ui.router', 'ui.bootstrap']) 
// share the same code 

但是,如果我將這兩種情況寫在一起,如下所示,它適用於網頁,,而我給Error: ng:btstrpd App Already Bootstrapped with this Element加載項

$(document).ready(function() { 
    angular.bootstrap(document, ['myApp']) 
    console.log("bootstrapped outside Office.initialize") 
}) 

Office.initialize = function (reason) { 
    $(document).ready(function() { 
     angular.bootstrap(document, ['myApp']) 
     console.log("bootstrapped inside Office.initialize") 
    }) 
} 

app = angular.module('myApp', ['ui.router', 'ui.bootstrap']). 

如果我設置一個標誌,控制檯將顯示bootstrapped outside Office.initialize其次isBootstrapped,然後運行代碼將顯示Office.contextOffice.context.document未定義

var isBootstrapped = false; 

$(document).ready(function() { 
    angular.bootstrap(document, ['myApp']) 
    isBootstrapped = true 
    console.log("bootstrapped outside Office.initialize") 
}) 

Office.initialize = function (reason) { 
    $(document).ready(function() { 
     if (isBootstrapped) console.log("isBootstrapped") 
     else { 
      angular.bootstrap(document, ['myApp']) 
      console.log("bootstrapped inside Office.initialize") 
     } 
    }) 
} 

app = angular.module('myApp', ['ui.router', 'ui.bootstrap']) 

所以我真的需要一個有效的方式檢查Office.js是否被加載到Office客戶端之外(即,它是否是網頁或加載項),以決定應該執行哪一塊angular.bootstrap

+0

我剛剛[提出問題](https://github.com/OfficeDev/office-js/issues/5),但顯然他們無法快速創建API,因此我們將不勝感激... – SoftTimur

+0

This功能(在外接程序之外使用Office.js)聽起來非常有前途,但我無法想象它是如何工作的。它如何連接到Office文件?應用程序如何使用Office.js?我找不到任何文檔。 –

+0

目標不是在加載項外使用'Office.js'。只是因爲這個應用程序同時服務於一個網站和一個Office加載項,所以在兩種情況下加載'Office.js'都很簡單。但是我們確實需要檢查代碼是否被加載爲網站或加載項。 – SoftTimur

回答

1

有目前沒有這樣的API,但我們已經在內部談到有一個Office.ready()(在精神上$(document).ready(...)相似),這將觸發每當Office.js做是在加載項或不進行初始化(是否)。

歡迎您在https://github.com/OfficeDev/office-js上推薦它,並在此發佈鏈接。我在API上的想法是,它會採取回調(就像$(document).ready(...),它會在準備就緒時觸發,並且還會以承諾的形式提供(所以你可以做await Office.ready())。你認爲這適用於你的場景嗎?

FWIW:作爲解決方法,對於Script Lab,我們在Office.initialized周圍包裝一個Promise(並確保在加載應用程序時儘早完成此操作,否則在晚些時候它不會觸發),等待如果我們在前3秒內沒有收到任何東西,我們將顯示一組按鈕,以便讓用戶幫助我們消除歧義。請參閱https://script-lab.azureedge.net/,查看一下看起來像什麼的例子。我們鼓勵您在office-js回購中提出一個建議錯誤,但是,請添加您的具體方案以支持它。

enter image description here

+0

謝謝邁克爾......請參閱我的**編輯1 **。我不確定您的Script Lab解決方案適用於我,您是否有解決方法? – SoftTimur

+0

如果你做了初始化,但是仍然有「Office.initialized」以設置一個實際上在Office中的標誌,該怎麼辦?我不知道還有什麼其他的解決方法可以提出,但我也鼓勵你直接打開一個暗示來自客戶的建議錯誤,我認爲這會有助於優先考慮這個問題(也是這樣,你會被訂閱以查看關於該問題的更新)。 –

+0

我實施了您爲Script Lab所做的解決方法,它爲我工作。然而,缺點是我們需要等待幾秒鐘,當我們在瀏覽器中加載它作爲網站時。 Script Lab是否一樣? – SoftTimur

相關問題