添加 office.js 在 url 中添加 #,然后将其删除
Adding office.js adds # in the url, then removes it
我有一个平均堆栈网站。最初,views/index.html
(有<ui-view></ui-view>
)是所有页面的入口点。它使用 angular-ui-router
和 html5mode
。因此,浏览器中的https://localhost:3000/XXXX
将保持不变(而不是添加#
)并根据路由器显示相应的内容。
然后,我希望服务器也提供 Office 加载项。我将需要包含 office.js
和另一个路由器的 views/addin.html
,以便该站点提供一组 urls https://localhost:3000/addin/XXXX
,我不介意它是 html5mode
或不是(url 可以在某处包含 #
)。
所以这里是routes/index.js
的对应:
router.get('/addin/*', function (req, res) {
console.log("router.get /addin/*");
res.sendfile('./views/addin.html')
});
router.get('*', function(req, res) {
console.log("router.get *");
res.sendfile('./views/index.html');
});
这里是 views/addin.html
:
<html>
<head>
<title>F-addin</title>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.7/angular.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-router/0.3.2/angular-ui-router.js"></script>
<!--<script src="https://appsforoffice.microsoft.com/lib/1/hosted/office.js"></script>-->
<base href="/" />
</head>
<body ng-app="addinF">
addin content
<ui-view ng-cloak></ui-view>
</body>
<script>
var addinApp = angular.module('addinF', ['ui.router'])
addinApp.config(['$stateProvider', '$locationProvider', function ($stateProvider, $locationProvider) {
$stateProvider
.state('addinNew', {
url: '/addin/new',
template: "new page"
})
.state('addinHome', {
url: '/addin/home',
template: "home page"
})
$locationProvider.html5Mode(true);
}]);
</script>
</html>
当office.js
如上注释时,https://localhost:3000/addin/new
和https://localhost:3000/addin/home
在浏览器中运行良好。但是,当取消注释 office.js
时,会出现奇怪的行为:在浏览器中键入 https://localhost:3000/addin/new
将变为 https://localhost:3000/#/addin/new
,然后又变回 https://localhost:3000/addin/new
。而我们会看到addin content new page
出现一次就消失了。
在 office.js
未注释的情况下,如果我们使用 <SourceLocation DefaultValue="https://localhost:3000/addin/new"/>
加载清单文件,我们也会在任务窗格中看到 addin content new page
出现一次并消失,然后 Add-in Error Something went wrong and we couldn't start this add-in. Please try again later or contact your system administrator.
此处没有html5mode
,浏览器中的.../addin/new
或.../addin/home
只会显示addin content
;加载项可以加载,也只有addin content
。
我的目标是使指向 .../addin/new
或 .../addin/home
的加载项正常工作。 office.js
必须加载到某处。我不介意它是否是 html5mode
(即,url 有 #
),但任何一种方式的行为都是奇怪的或不令人满意的。有谁知道如何修复它或有解决方法吗?
正在查看 office.js 文件的调试版本:
https://appsforoffice.microsoft.com/lib/1/hosted/office.debug.js
您会看到 window 的历史 replaceState 和 pushState 函数设置为空:
window.history.replaceState = null;
window.history.pushState = null;
它禁用了操纵浏览器历史记录的能力,它似乎 Angular 认为历史记录 API 不可用,所以 Angular 退回到主题标签导航。
在 office.js
缩小版本中,您可以通过查找找到这两行:
window.history.replaceState=e;window.history.pushState=e;
您可以删除这两行代码以重新启用 html5mode,但我不确定 office.js 插件是否会继续正常工作。
我有一个平均堆栈网站。最初,views/index.html
(有<ui-view></ui-view>
)是所有页面的入口点。它使用 angular-ui-router
和 html5mode
。因此,浏览器中的https://localhost:3000/XXXX
将保持不变(而不是添加#
)并根据路由器显示相应的内容。
然后,我希望服务器也提供 Office 加载项。我将需要包含 office.js
和另一个路由器的 views/addin.html
,以便该站点提供一组 urls https://localhost:3000/addin/XXXX
,我不介意它是 html5mode
或不是(url 可以在某处包含 #
)。
所以这里是routes/index.js
的对应:
router.get('/addin/*', function (req, res) {
console.log("router.get /addin/*");
res.sendfile('./views/addin.html')
});
router.get('*', function(req, res) {
console.log("router.get *");
res.sendfile('./views/index.html');
});
这里是 views/addin.html
:
<html>
<head>
<title>F-addin</title>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.7/angular.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-router/0.3.2/angular-ui-router.js"></script>
<!--<script src="https://appsforoffice.microsoft.com/lib/1/hosted/office.js"></script>-->
<base href="/" />
</head>
<body ng-app="addinF">
addin content
<ui-view ng-cloak></ui-view>
</body>
<script>
var addinApp = angular.module('addinF', ['ui.router'])
addinApp.config(['$stateProvider', '$locationProvider', function ($stateProvider, $locationProvider) {
$stateProvider
.state('addinNew', {
url: '/addin/new',
template: "new page"
})
.state('addinHome', {
url: '/addin/home',
template: "home page"
})
$locationProvider.html5Mode(true);
}]);
</script>
</html>
当office.js
如上注释时,https://localhost:3000/addin/new
和https://localhost:3000/addin/home
在浏览器中运行良好。但是,当取消注释 office.js
时,会出现奇怪的行为:在浏览器中键入 https://localhost:3000/addin/new
将变为 https://localhost:3000/#/addin/new
,然后又变回 https://localhost:3000/addin/new
。而我们会看到addin content new page
出现一次就消失了。
在 office.js
未注释的情况下,如果我们使用 <SourceLocation DefaultValue="https://localhost:3000/addin/new"/>
加载清单文件,我们也会在任务窗格中看到 addin content new page
出现一次并消失,然后 Add-in Error Something went wrong and we couldn't start this add-in. Please try again later or contact your system administrator.
此处没有html5mode
,浏览器中的.../addin/new
或.../addin/home
只会显示addin content
;加载项可以加载,也只有addin content
。
我的目标是使指向 .../addin/new
或 .../addin/home
的加载项正常工作。 office.js
必须加载到某处。我不介意它是否是 html5mode
(即,url 有 #
),但任何一种方式的行为都是奇怪的或不令人满意的。有谁知道如何修复它或有解决方法吗?
正在查看 office.js 文件的调试版本:
https://appsforoffice.microsoft.com/lib/1/hosted/office.debug.js
您会看到 window 的历史 replaceState 和 pushState 函数设置为空:
window.history.replaceState = null;
window.history.pushState = null;
它禁用了操纵浏览器历史记录的能力,它似乎 Angular 认为历史记录 API 不可用,所以 Angular 退回到主题标签导航。
在 office.js
缩小版本中,您可以通过查找找到这两行:
window.history.replaceState=e;window.history.pushState=e;
您可以删除这两行代码以重新启用 html5mode,但我不确定 office.js 插件是否会继续正常工作。