我刚刚用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'
}).
...
所以我最终得到了两个问题:
答案 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);
}));