为什么MEAN.js applications'URL以#开头!

时间:2015-02-17 19:04:09

标签: javascript angularjs url mean-stack meanjs

我刚刚用MEAN.JS开始了我的第一个MEAN应用程序构建。在发现mean.js如何组织应用程序之后,我想知道为什么URL以/#!/开头。

例如,对于我想要的登录页面:

http://example.com/login

而不是:

http://example.com/#!/login

所以我查看了Express和Angular文档并且没有发现它。我还阅读了完整的MEAN.JS文档但仍未找到任何内容。

在Angular的模块配置路由文件中,URL不是#!的前缀:

users.client.routes.js:

...
state('login', {
    url: '/login',
    templateUrl: 'modules/users/views/authentication/login.client.view.html'
}).
...

所以我最终得到了两个问题:

  1. 为什么网址会这样开头?这背后有一个很好的做法吗?
  2. 如果这不是一件坏事,我该如何以及在哪里更改这些网址?

2 个答案:

答案 0 :(得分:3)

与所有单页应用程序框架一样,Angular使用哈希#锚点来欺骗浏览器将客户端链接重定向回JavaScript而不是发出服务器请求。 $location service用于管理此流程。

  

$location服务解析浏览器地址栏中的URL(基于window.location),并使URL可供您的应用程序使用。对地址栏中URL的更改将反映到$ location服务中,对$ location的更改将反映到浏览器地址栏中。

其他框架使用hashbang或#!来允许您仍然使用#作为实际的页面锚点。角度定位服务可以自定义以启用此功能,并且还可以自定义以允许您完全不使用#,如果您的目标受众使用符合HTML 5的浏览器,并且您已在其上配置了其他重定向服务器

Mean.js开发团队选择将hashbang格式作为标准。在https://github.com/meanjs/mean/blob/master/public/application.js中,您会看到$locationProvider.hashPrefix('!');

您也可以使用自己的自定义覆盖此设置(例如$路径为#$),删除此行并恢复默认值#而不是#!角度,或启用HTML 5模式。

最好彻底阅读$location service的文档,因为它讨论了页面刷新影响,网页抓取工具,服务器配置选项,HTML 5模式的警告等等。

答案 1 :(得分:1)

Angular在非HTML5浏览器的网址中使用hashtag。

这可以通过以下方式解决:

angular.module('yourapp').config(function($locationProvider) {
    $locationProvider.html5Mode(true); 
}));