9

我正在构建一个不在根位置的 AngularJS 应用程序domain.tld/blog。我为/blog基地上的所有东西设置了路由设置。我在页面的头部包含了基本标签<base href="/blog">html5Mode设置为true。在应用程序中,一切都按预期工作。但是,当我单击基本位置之外的非角度 URL 时,不会加载页面。似乎这个位置被otherwise路由器中的功能捕获:

ROUTER.otherwise({
  redirectTo : '/blog'
});

因此,当我单击任何 url 时,即domain.tld/somewhere-else重定向到 domain.tld/blog。显然这是您所期望的:对于在路由器中找不到的每个 URL,将其重定向到“主页”。在我的应用程序中,这不是所需的行为。所有不在路由器中的 url 都应被视为普通 url 并触发页面重新加载到该 url。

所以我需要的是这样的:

ROUTER.otherwise(
     window.location = theRequestedUrl;
);

这显然不起作用。但不知何故,我需要进入路由器的其他部分,并告诉它重定向到页面并重新加载页面。

以下问题是相关的:角度路由发生了一些奇怪的事情

以下 jsFiddle 演示了该问题(感谢@rdjs!)http://fiddle.jshell.net/43tub/6/show/light/。单击/outside链接应该会刷新整页...

4

4 回答 4

9

根据 Angular文档

在以下情况下,链接不会被重写;相反,浏览器将对原始链接执行完整的页面重新加载。

  • 包含目标元素的链接
    示例:<a href="/ext/link?a=b" target="_self">link</a>
  • 指向不同域的绝对链接
    示例:<a href="http://angularjs.org/">link</a>
  • 以该开头的链接'/'在定义 base 时会导致不同的基本路径
    示例:<a href="/not-my-base/link">link</a>

看看这是否对你有帮助

于 2013-08-05T13:15:22.040 回答
5

查看代码,看起来基数是“/blog/”而不是“/blog”很重要。一旦我改变了,我就可以相对地引用链接:

  <a href="./Book/Moby">Moby</a> |
  <a href="./Book/Gatsby">Gatsby</a> |
  <a href=".">base root</a> |
  <a href="/Outside">Outside</a> |  // gets a nice 404

我的jsfiddle,请注意 location.pathname 始终设置“[path]/”,这在编辑时也可以硬编码 /_display/ 工作,但是 jsfiddle 在运行时在 _display/ 和 workingdir/show/ 之间切换并保存小提琴。

于 2013-08-09T12:14:35.910 回答
2

你也可以这样做:

var redirect = function(skip, url) {
    console.log("Redirecting to ", url);
    window.location.href = url
};
$routeProvider
    .when('/inside-router', { templateUrl: 'something.html' })
    .when('/get-me-away.html', { redirectTo: redirect })
    .when('/static/:file', { redirectTo: redirect })

这是一个带有工作示例的 JSFiddle

基本上,您滥用 AngularJS 将调用redirectTo属性中给定的函数,然后如果该函数不返回字符串,则什么也不做。

于 2013-11-12T19:05:30.730 回答
0

希望能帮助到你:

$routeProvider
.when('...', {})
.otherwise({
  redirectTo: function () {
    window.location = location.pathname;
}});

使用:
1.3.10/angular.js
1.3.10/angular-route.js

于 2015-01-22T15:01:33.843 回答