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

时间:2017-07-08 17:51:03

标签: ms-office office-js

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

此信息非常有用。

有没有人知道我的代码中是否有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'])
...

因此,对于网页,我需要在angular.bootstrap内编写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

但是,如果我将这两个案例一起编写如下,则适用于网页,而我为{+ 3}}添加

$(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应该是哪一部分执行。

2 个答案:

答案 0 :(得分:5)

目前还没有这样的API,尽管我们内部已经讨论过Office.ready()(与$(document).ready(...)精神相似),只要Office.js初始化就会触发(无论是在加载项中是否。)

欢迎您在https://github.com/OfficeDev/office-js上提出建议,并在此处发布链接。我对API的想法是,它会接受一个回调(就像$(document).ready(...)一样,它会在准备就绪时触发,并且也可以以承诺形式提供(所以你可以await Office.ready())。你呢?认为这适用于您的场景?

FWIW:作为一种解决方法,对于Script Lab,我们将一个Promise包装在Office.initialized周围(并确保在加载应用程序的早期做到这一点,否则如果它在以后很晚就不会触发) ),等待它,如果我们在前3秒内没有收到任何信息,我们会显示一组按钮,让用户帮助我们消除歧义。有关示例的示例,请参阅https://script-lab.azureedge.net/。不完美,但对于我们的场景来说还不错。我鼓励你在office-js repo上提出一个建议错误,但是添加你的具体方案来支持它。

enter image description here

答案 1 :(得分:2)

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

OfficeHelpers.Utilities.hostOfficeHelpers.Utilities.platform都提供了有用的信息。