如何让 Angular UI 路由器遵守 "non-routed" URL
How to get Angular UI Router to respect "non-routed" URLs
这是我第一次使用 AngularUI 路由器,所以我想我犯了一个新手错误,希望有人能指导我。
我已经配置了一个单页应用程序以在 HTML5 模式下使用 Angular UI 路由器,并且一切似乎都按预期工作。
.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);
}
])
但是,同一页面还包含一些指向同一站点上其他静态页面的链接,使用相对 URLs。在安装 Angular 路由之前,这些链接可以正常工作,但现在它们已损坏。具体来说,单击这些链接中的任何一个都会正确更改浏览器地址栏,但不会触发到该目标页面的导航。
我想我需要添加一些东西来告诉路由配置忽略某些 URL 模式,但我还没有找到任何信息来告诉我如何做到这一点。有什么建议吗?
谢谢,
蒂姆
经过一些调查,我发现这个问题与 Angular UI 路由器没有特别的关系。同样的行为也存在于原生 AngularJS 路由机制中,并且是由 $location
实现的 link 重写逻辑引起的,如 this documentation.[=16= 中所述]
问题的进一步讨论是here。
我找到了两个可能的解决方案,它们似乎都运行良好:
明确将 links 定位到静态页面:通过在任何 links 中包含属性 target="_self"
到静态页面(即页面超出定义的 Angular 路由方案)它们将被 AngularJS 忽略,从而正确呈现。
禁用link重写:在HTML5模式下配置Angular路由时,支持两种语法格式。最简单的格式...
$locationProvider.html5Mode(true);
... 使用默认配置启用 HTML5 模式。但是,长格式语法提供了对其他配置属性的访问,其中之一通过禁用 Angular 拦截和重写 link URL 的默认行为解决了上述问题:
$locationProvider.html5Mode({
enabled: true,
requireBase: false,
rewriteLinks: false
});
我使用了第二种解决方案,它似乎对路由方案中定义的 URL 的行为没有不利影响。这个解决方案似乎同样适用于 Angular UI 路由器和原生 AngularJS 路由。
这是我第一次使用 AngularUI 路由器,所以我想我犯了一个新手错误,希望有人能指导我。
我已经配置了一个单页应用程序以在 HTML5 模式下使用 Angular UI 路由器,并且一切似乎都按预期工作。
.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);
}
])
但是,同一页面还包含一些指向同一站点上其他静态页面的链接,使用相对 URLs。在安装 Angular 路由之前,这些链接可以正常工作,但现在它们已损坏。具体来说,单击这些链接中的任何一个都会正确更改浏览器地址栏,但不会触发到该目标页面的导航。
我想我需要添加一些东西来告诉路由配置忽略某些 URL 模式,但我还没有找到任何信息来告诉我如何做到这一点。有什么建议吗?
谢谢, 蒂姆
经过一些调查,我发现这个问题与 Angular UI 路由器没有特别的关系。同样的行为也存在于原生 AngularJS 路由机制中,并且是由 $location
实现的 link 重写逻辑引起的,如 this documentation.[=16= 中所述]
问题的进一步讨论是here。
我找到了两个可能的解决方案,它们似乎都运行良好:
明确将 links 定位到静态页面:通过在任何 links 中包含属性 target="_self"
到静态页面(即页面超出定义的 Angular 路由方案)它们将被 AngularJS 忽略,从而正确呈现。
禁用link重写:在HTML5模式下配置Angular路由时,支持两种语法格式。最简单的格式...
$locationProvider.html5Mode(true);
... 使用默认配置启用 HTML5 模式。但是,长格式语法提供了对其他配置属性的访问,其中之一通过禁用 Angular 拦截和重写 link URL 的默认行为解决了上述问题:
$locationProvider.html5Mode({
enabled: true,
requireBase: false,
rewriteLinks: false
});
我使用了第二种解决方案,它似乎对路由方案中定义的 URL 的行为没有不利影响。这个解决方案似乎同样适用于 Angular UI 路由器和原生 AngularJS 路由。