首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查Office.js是否加载到Office.js之外

检查Office.js是否加载到Office.js之外
EN

Stack Overflow用户
提问于 2017-07-08 17:51:02
回答 2查看 4.8K关注 0票数 8

如果我们在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 (即网页和外接程序)。

所以对于一个网页,我可以写:

代码语言:javascript
复制
$(document).ready(function () {
    angular.bootstrap(document, ['myApp'])  
})

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

因此,对于网页,我需要在Office.initialize中编写Office.initialize,并与外接程序共享其他代码:

代码语言:javascript
复制
Office.initialize = function (reason) {
    $(document).ready(function () {
        angular.bootstrap(document, ['myApp'])
    });
}

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

但是,如果我按照下面的方式将这两种情况写在一起,那么它适用于一个网页,,而我给出了 错误: ng:btstrpd应用程序已经用此元素引导 用于外接程序

代码语言:javascript
复制
$(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.initializeisBootstrapped,那么运行代码的将显示或 Office.context.document 是未定义的

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-02 05:48:12

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

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

票数 2
EN

Stack Overflow用户

发布于 2017-07-08 19:25:32

目前还没有这样的API,尽管我们内部已经讨论过有一个Office.ready() (在精神上类似于$(document).ready(...)),每当Office.js完成初始化时(不管是否在外接程序中),它都会触发。

欢迎您在https://github.com/OfficeDev/office-js上推荐它,并在这里发布一个链接。我在API上的想法是,它将接受一个回调(就像$(document).ready(...)一样,它在准备好时就会启动,并且还可以以承诺的形式使用(所以您可以使用await Office.ready())。你认为这对你的场景有用吗?

FWIW:作为一种解决方法,对于脚本实验室,我们围绕Office.initialized (并确保在加载应用程序时尽早完成它,否则它将不会启动),等待它,如果我们在前3秒内没有收到任何东西,我们会显示一组按钮,让用户帮助我们消除歧义。有关该示例的示例,请参阅https://script-lab.azureedge.net/。不完美,但对我们的场景来说还不错。不过,我确实鼓励您将建议错误提交到office-js repo上,添加具体的场景来支持它。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44989152

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档