AngularJS:如何通过深层链接启用$ locationProvider.html5Mode

时间:2013-08-13 16:51:13

标签: angularjs

当通过$locationProvider.html5Mode(true)在AngularJS中启用html5Mode时,当您登陆网站的更深层页面时,导航似乎会出现偏差。

例如:

  • http://www.site.com
    当我导航到根目录时,我可以点击网站中的所有链接,Angular的$routeProvider将接管浏览网站并加载正确的视图。

  • http://www.site.com/news/archive
    但是当我导航到这个网址时(或者当我在像上面这样的深层链接时点击刷新...)这个导航无法正常工作。 首先,我们作为Documentation for $locationProvider.html5Mode指定,我们捕获服务器上的所有URL,类似于angular中的otherwise路由,并返回与根域相同的html。但是,如果我在角度的$location函数中检查run对象,它会告诉我http://www.site.com是我的host/archive是我{ {1}}。 path到达$routeProvider子句,因为我只有.otherwise()作为有效路由。该应用程序做了奇怪的事情。

也许在服务器上的重写需要以不同的方式完成,或者我需要以角度指定内容,但是目前我对于为什么角度看不包含/news/archive段的路径感到无能为力。

示例main.js:

/news

修改 根据要求,服务器端的更多细节: 服务器端是由zend框架的路由组织的,它处理它自己的路由(用于向特定// Create an application module var App = angular.module('App', []); App.config(['$routeProvider', '$locationProvider', function AppConfig($routeProvider, $locationProvider) { $routeProvider .when( '/', { redirectTo: '/home' }) .when('/home', { templateUrl: 'templates/home.html' }) .when('/login', { templateUrl: 'templates/login.html' }) .when('/news', { templateUrl: 'templates/news.html' }) .when('/news/archive', { templateUrl: 'templates/newsarchive.html' }) // removed other routes ... *snip .otherwise({ redirectTo: '/home' } ); // enable html5Mode for pushstate ('#'-less URLs) $locationProvider.html5Mode(true); $locationProvider.hashPrefix('!'); }]); // Initialize the application App.run(['$location', function AppRun($location) { debugger; // -->> here i debug the $location object to see what angular see's as URL }]); URL上的前端提供数据,最后,如果没有其他特定的其他路由,则有一个全能路由路由绑定,它提供与根路由相同的html。 所以它基本上服务于那条深层链接路线上的主页html。

更新2 在研究了这个问题后,我们注意到这个路由工作正常,在Angular 1.0.7 stable上,但是在Angular 1.1.5 unstable中显示了上述行为。

我已经检查了更改日志,但到目前为止还没有找到任何有用的内容,我想我们可以将其作为错误提交,或者与他们所做的某些更改相关联的不需要的行为,或者只是等着看它是否有效得到了固定在后来发布的稳定版本。

5 个答案:

答案 0 :(得分:82)

发现那里没有错误。 只需添加:

<base href="/" />

<head />

答案 1 :(得分:10)

这是我发现的最佳解决方案,经过更多时间而不是我承认。基本上,添加target =&#34; _self&#34;到确保页面重新加载所需的每个链接。

http://blog.panjiesw.com/posts/2013/09/angularjs-normal-links-with-html5mode/

答案 2 :(得分:9)

这个问题是由于使用了AngularJS 1.1.5(这是不稳定的,显然有一些错误或路由的实现不同于1.0.7)

将其恢复到1.0.7会立即解决问题。

已经尝试了1.2.0rc1版本,但还没有完成测试,因为我不得不重写一些路由器功能,因为他们把它从核心中取出。

无论如何,使用AngularJS vs 1.0.7时,此问题已解决。

答案 3 :(得分:8)

答案 4 :(得分:6)

我的问题解决了这些:

1-将此添加到您的脑袋:

<base href="/" />

2-在app.config

中使用此功能
$locationProvider.html5Mode(true);