检查Office.js是否在Office客户端之外加载

Sof*_*mur 6 ms-office office-js

如果我们office.js在Office客户端外部加载引用网页,则会收到警告:Office.js is loaded outside of Office client

此信息很有用。

有人知道我的代码中是否有API可以检查该API?

编辑1:

我会解释一下我的情况以及为什么问这个问题。我正在使用angularjs制作应用程序,可以将其作为网页加载到浏览器中,也可以作为加载项加载到Office中。我意识到,我们不应该做的<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'])
...
Run Code Online (Sandbox Code Playgroud)

因此,对于网页,我需要在angular.bootstrapinside 中编写Office.initialize代码,并在插件的情况下共享其他代码:

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

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

但是,如果我按以下方式将这两种情况写在一起,则它适用于网页,而我给出了错误:ng:btstrpd应用程序已经使用此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']).
Run Code Online (Sandbox Code Playgroud)

如果我设置一个标志,控制台将显示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'])
Run Code Online (Sandbox Code Playgroud)

因此,我确实需要一种有效的方法来检查Office.js是否已加载到Office客户端之外(即,它是网页还是外接程序),以确定angular.bootstrap应该执行哪一部分。

Mic*_*oft 5

目前,尚无此类API,尽管我们内部已在讨论拥有一种Office.ready()(本质上类似于$(document).ready(...)),但只要Office.js完成初始化(无论是否在外接程序中),该API都会触发。

欢迎您在https://github.com/OfficeDev/office-js上提出建议,并在此处发布链接。我对API的想法是,它将接受一个回调(就像$(document).ready(...)它准备就绪时将触发一样,并且也可以以Promise形式使用(因此您可以这样做await Office.ready())。您认为这种方法对您的情况有用吗?

FWIW:作为一种变通方法,对于Script Lab,我们将Promise包裹在Office.initialized周围(并确保在加载应用程序时尽早完成,否则,它将在以后很长时间内不会触发),请等待,如果在开始的3秒钟内什么都没收到,我们会显示一组按钮,以便用户帮助我们消除歧义。有关外观的示例,请参见https://script-lab.azureedge.net/。并不完美,但是对于我们的情况来说还可以。我确实鼓励您在office-js仓库中提交建议错误,但是添加了具体的方案来支持它。

在此处输入图片说明


小智 2

一种方法是使用https://github.com/OfficeDev/office-js-helpers

两者OfficeHelpers.Utilities.hostOfficeHelpers.Utilities.platform提供有用的信息。