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.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'])
Run Code Online (Sandbox Code Playgroud)
因此,我确实需要一种有效的方法来检查Office.js是否已加载到Office客户端之外(即,它是网页还是外接程序),以确定angular.bootstrap应该执行哪一部分。
目前,尚无此类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.host都OfficeHelpers.Utilities.platform提供有用的信息。
| 归档时间: |
|
| 查看次数: |
2200 次 |
| 最近记录: |