【问题标题】:How to get Angular UI Router to respect "non-routed" URLs如何让 Angular UI 路由器尊重“非路由”URL
【发布时间】:2015-01-25 21:43:18
【问题描述】:

这是我第一次使用 AngularUI Router,所以我想我犯了一个新手错误,希望有人能指导我。

我已经配置了一个单页应用程序以在 HTML5 模式下使用 Angular UI Router,而且一切似乎都按预期工作。

.config([
    "$stateProvider", "$urlRouterProvider", "$locationProvider",
    function ($stateProvider, $urlRouterProvider, $locationProvider) {
        $stateProvider.state("concept", {
            url: "/concepts/:conceptKey",
            templateUrl: "/templates/concept-view.html",
            controller: "conceptViewController",
            resolve: {
                concept: [
                    "$stateParams", "conceptsApi",
                    function ($stateParams, conceptsApi) {
                        return conceptsApi.getConcept($stateParams.conceptKey);
                    }
                ]
            }
        });

        $urlRouterProvider.otherwise("/");

        $locationProvider.html5Mode(true);
    }
])

但是,同一页面还包含一些指向同一站点上其他静态页面的链接,这些链接使用相对 URL。在安装 Angular 路由之前,这些链接可以正常工作,但现在它们已损坏。具体来说,点击其中任何一个链接会正确更改浏览器地址栏,但不会触发导航到该目标页面。

我假设我需要添加一些内容来告诉路由配置忽略某些 URL 模式,但我没有找到任何信息来告诉我如何执行此操作。请问有什么建议吗?

谢谢, 蒂姆

【问题讨论】:

  • 您的服务器端似乎没有配置好。无论如何,请检查 UI-Router 和 html5 的this link with example/plunker。如果服务器配置良好 - 这应该也可以。
  • 感谢您的建议,但我不明白这如何适用于我的情况。 UI 路由对于与定义的状态配置对应的 URL 可以正常工作,但它会阻止导航到同一域上的静态页面。如果我直接从新的浏览器选项卡请求该静态页面,它会正确呈现,如果我禁用路由,它同样如此。该问题仅在路由处于活动状态时发生,其中 SPA 内针对 SPA 外部页面的所有链接都已损坏。
  • 我想我现在明白了。然后(如果我理解你的问题)我会说,你只需要改变你的服务器部分。我正在使用 ASP.NET MVC ......这是一个我可以设置服务器如何对任何 url 作出反应的地方。有些重定向到 index.html...有些按预期提供。在那里检查...(链接如何在 mvc stackoverflow.com/a/27707238/1679310 中设置)
  • 我也在使用 ASP.NET MVC,并且我创建了一个控制器操作,该操作被映射以响应 UI 路由方案使用的每个可能的 URL。无论 URL 是什么,它总是提供相同的响应,并且它依赖于客户端来解释 URL 并进行 API 调用来填充视图。如果我向此控制器操作发出请求,它总是按预期响应(使用 Fiddler 验证)。所以,在我看来,问题出在客户端。 UI 路由似乎阻止了浏览器遵循正常(非路由)的 URL,正如我所期望的那样。

标签: angular-ui-router


【解决方案1】:

经过一番调查,我发现这个问题与 Angular UI Router 没有特别的关系。同样的行为也存在于原生 AngularJS 路由机制中,是由$location 实现的链接重写逻辑引起的,如this documentation 中所述。

问题的进一步讨论是here

我找到了两种可能的解决方案,似乎都很好用:

明确定位到静态页面的链接:通过在任何指向静态页面(即不属于定义的 Angular 路由方案的页面)的链接中包含属性 target="_self",它们将被 AngularJS 忽略,因此正确渲染。

禁用链接重写:在 HTML5 模式下配置 Angular 路由时,支持两种语法格式。最简单的格式...

$locationProvider.html5Mode(true);

... 使用默认配置启用 HTML5 模式。但是,长格式语法提供了对其他配置属性的访问,其中之一通过禁用 Angular 截取和重写链接 URL 的默认行为来解决上述问题:

$locationProvider.html5Mode({
    enabled: true,
    requireBase: false,
    rewriteLinks: false
});

我使用了第二种解决方案,它似乎对路由方案中定义的 URL 的行为没有不利影响。这个解决方案似乎同样适用于 Angular UI 路由器和原生 AngularJS 路由。

【讨论】:

  • 使用第一个选项,您必须添加到所有链接“target="_self",但您可以选择链接是否会更改 url 或重定向到此 url.. .第二个....不需要更改所有链接...但是您不能选择2种不同类型的链接....对吗??
  • @Michalis 是的,第一种方法对链接的行为提供了更细粒度的控制,但实施起来更加繁琐。第二种方法在全局范围内实现相同的行为,但不允许灵活地单独配置链接行为。
  • $location 文档中的另外两个解决方案 - 如果 URL 是指向另一个域的绝对 URL,或者 URL 以“/”开头并导致不同的基数,Angular 也不会重写路径。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-28
  • 1970-01-01
  • 2016-07-17
  • 2015-04-14
  • 2014-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多