如果我们在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.context
或Office.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 :(得分: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上提出一个建议错误,但是添加你的具体方案来支持它。
答案 1 :(得分:2)
一种方法是使用https://github.com/OfficeDev/office-js-helpers。
OfficeHelpers.Utilities.host
和OfficeHelpers.Utilities.platform
都提供了有用的信息。