AngularJS SPA路由获取URL为" /#!"而不是"#"

时间:2017-06-11 05:42:50

标签: javascript html angularjs mean-stack hashbang

在我的SPA AngularJS应用程序中,我将网址设为http://localhost:4200/#!/,而不只是# (hash bang)。因此,路由似乎不能以通常的方式工作。 我确实经历了这个stackoverflow Question,但没有找到任何解决方案。有人知道摆脱这个额外感叹号的解决方案吗?

编辑: 在我的index.ejs:中 我有<a href="#about">about</a>

在我的approutapp.js:中 我有

&#13;
&#13;
var myapp = angular.module("myApp", ["ngRoute"]);
myapp.config(function($routeProvider) {
    $routeProvider
    .when("/", {
        templateUrl : "/static/list.ejs"
    })
    .when("/about", {
        templateUrl : "/static/about-us.ejs"
    })

});

myapp.config(['$locationProvider', function($locationProvider) {
  $locationProvider.hashPrefix('');
}]);
&#13;
&#13;
&#13;

但我仍然获得的网址为:http://localhost:4200/#/!/

然后转到http://localhost:4200/about 页面挂起

2 个答案:

答案 0 :(得分:3)

尝试使用$locationProvider.hashPrefix('')

原因是:

如果浏览器是HTML5浏览器,angularJS会将其重定向到#!

否则只会#

请阅读$location上的此文档,了解有关详情:

Opening a regular URL in a legacy browser -> redirects to a hashbang

URL Opening hashbang URL in a modern browser -> rewrites to a regular URL 
  

HTML5模式

     

在HTML5模式下,$location服务getter和setter与之交互   浏览器URL地址通过HTML5历史记录API。这允许   使用常规URL路径和搜索段,而不是他们的hashbang   等价物。如果浏览器不支持HTML5 History API,   $ location服务将回退到使用hashbang URL   自动。这让你不必担心是否   显示您的应用的浏览器是否支持历史记录API;该   $ location服务透明地使用最佳可用选项。

     

在旧版浏览器中打开常规网址 - &gt;重定向到hashbang   URL在现代浏览器中打开hashbang URL - &gt;重写为常规   URL请注意,在此模式下,AngularJS会拦截所有链接(受制于   &#34; Html链接重写&#34;以下规则)并以某种方式更新网址   从不执行整页重新加载。

答案 1 :(得分:0)

这种变化可以在角度版本中观察到&gt; 1.6.x上在之前的版本中,它只是#(哈希爆炸)。 要仅以#方式获取网址,您只需以这种方式编写,

appModule.config(['$locationProvider', function($locationProvider) {
  $locationProvider.hashPrefix('');
}]);

此更改已在version 1.6.0中引入,您可以看到https://github.com/angular/angular.js/blob/master/CHANGELOG.md#location-due-to

另外,在这里添加的是:

  

$location hash-bang网址的哈希前缀已从空字符串“”更改为“bang”!“。如果您的应用程序未使用HTML5 mode或正在不支持HTML5 mode的浏览器上运行,并且您尚未指定自己的哈希前缀,则客户端URL现在将包含“!”字首。例如,而不是mydomain.com/#/a/b/c将成为mydomain.com /#!/ a / b / c。