3

我有一个平均堆栈网站,可以html5mode通过$locationProvider.html5Mode(true). 如下index.html所示:

<html>
<head>
    <base href="/" />
    ...
</head>
<body ng-app="f">
    <ui-view ng-cloak></ui-view>
</body>
</html>

因为html5mode,我们可以在浏览器中加载,例如。https://localhost:3000/home,这将保持不变;没有html5mode,那个 url 就会变成https://localhost:3000/#/home.

现在我希望服务器(除了网站)还提供 Office 加载项。我需要能够<SourceLocation DefaultValue="https://localhost:3000/addin" />在加载项清单文件中执行此操作。为此,我需要 添加<script src="https://appsforoffice.microsoft.com/lib/1/hosted/office.js"></script>.index.html

但是,我意识到添加网站后,<script src="https://appsforoffice.microsoft.com/lib/1/hosted/office.js"></script>在浏览器index.html中加载https://localhost:3000/home变为https://localhost:3000/#/home,这意味着添加office.js禁用html5mode

有谁知道怎么回事?有人有解决方法吗?

4

3 回答 3

3

查看 office.js 文件的调试版本:

https://appsforoffice.microsoft.com/lib/1/hosted/office.debug.js

您会看到窗口的历史记录 replaceState 和 pushState 函数设置为 null:

window.history.replaceState = null;
window.history.pushState = null;

这禁用了操纵浏览器历史记录的能力,并且似乎 Angular 认为历史 API 不可用,因此 Angular 回退到标签导航。

您可以删除这两行代码以重新启用 html5mode,但考虑到 History API 肯定会因某种原因被禁用,因此office.js 插件可能会在启用 html5mode 时停止正常工作

于 2017-07-01T06:59:06.743 回答
3

修改“office.js”本身是错误的做法。首先,商店目前要求您参考Office.js官方CDN;因此,这种方法已经存在问题。此外,您不希望必须继续对一组经常更改的文件应用相同的补丁,也不希望仅仅因为旧版本是您修改过的版本而停留在旧版本上。

一个更好的方法是有一个额外的文件来填补空白,但只是作为一个附加的东西。它的侵入性要小得多,而且不易破裂。

特别是关于历史的问题:请参阅Office.js 取消浏览器历史功能,破坏历史使用,以使用 polyfill 启用历史。

于 2017-07-03T01:59:46.633 回答
0

将评论作为答案

据我了解,office.js只需要办公应用程序,在这种情况下,不要用 office-js 给你的 web 应用程序增加负担。仅在需要时使用ocLazyLoad(或其他类似库)来office.js可选地/动态地加载。

于 2017-07-03T05:32:05.300 回答