没有散​​列'#'的AngularJS路由

pik*_*ile 222 javascript angularjs

我正在学习AngularJS,有一件事让我很烦.

我用来$routeProvider为我的应用程序声明路由规则:

$routeProvider.when('/test', {
  controller: TestCtrl,
  templateUrl: 'views/test.html'
})
.otherwise({ redirectTo: '/test' });
Run Code Online (Sandbox Code Playgroud)

但是当我在浏览器中导航到我的应用程序时,我看到了app/#/test而不是app/test.

所以我的问题是为什么AngularJS将此哈希添加#到网址?有没有可能避免它?

plu*_*us- 264

实际上,对于非HTML5浏览器,您需要#(#标签).

否则,他们只会在提到的href上对服务器进行HTTP调用.#是一个旧的浏览器短路,它不会触发请求,这允许许多js框架在其上构建自己的客户端重新路由.

您可以使用$locationProvider.html5Mode(true)告诉angular使用HTML5策略(如果可用).

这里是支持HTML5策略的浏览器列表:http://caniuse.com/#feat =history

  • 当您想要跟踪应用程序状态时,它很有用.框架提供了历史机制.此外,它允许通过URL共享直接访问应用程序的状态 (6认同)
  • 在支持HTML5历史记录API的现代浏览器中不需要哈希标签.请参阅@ skeep的答案和提供的链接.在HTML5模式下,如果浏览器不支持,Angular将仅使用主题标签.另请注意,如果您不想使用$ routeProvider,则可以使用ng-clicks和ng-include连接自己的路由(实际上,如果需要多个级别,则必须执行此操作路由,因为ng-view每页只能出现一次).另见http://stackoverflow.com/questions/12793609/app-design-using-angular-js (6认同)
  • 但如果是这样,为什么我需要在位置栏中显示这些路径?如果用户不使用它们,我可以制作单页javascript应用程序. (5认同)
  • 好的谢谢.这是我怀疑的.但至于我,这是非常不友好的用户!假设我希望通过url,app/res提供一些资源.我的网站用户怎么能发现他们应该输入app /#/ res呢? (4认同)
  • 对于hashbang/pushstate /服务器端渲染html案例,Twitter很好看http://engineering.twitter.com/2012/12/implementing-pushstate-for-twittercom_7.html它解释了他们如何设法这样做它向后兼容旧浏览器和搜索引擎.我知道它不是特定的棱镜,但你可以重现流动. (2认同)

bea*_*end 47

如果您启用了其他人说过的html5mode,并创建一个.htaccess包含以下内容的文件(根据您的需要进行调整):

RewriteEngine   On
RewriteBase     /
RewriteCond     %{REQUEST_URI} !^(/index\.php|/img|/js|/css|/robots\.txt|/favicon\.ico)
RewriteCond     %{REQUEST_FILENAME} !-f
RewriteCond     %{REQUEST_FILENAME} !-d
RewriteRule     ./index.html [L]
Run Code Online (Sandbox Code Playgroud)

当用户进入正确的路线时,用户将被定向到您的应用,您的应用将读取该路线并将其带​​到其中的正确"页面".

编辑:只是确保没有任何文件或目录名称与您的路由冲突.

  • 记住head标签中的<base href ="/"> </ base> (4认同)
  • @chovy - 这里是nGinx版本:server {server_name my-app; root/path/to/app; location/{try_files $ uri $ uri//index.html; }} (3认同)

vij*_*jay 38

让我们写一些简单而简短的答案

在Router at end添加html5Mode(true) ;

app.config(function($routeProvider,$locationProvider) {

    $routeProvider.when('/home', {
        templateUrl:'/html/home.html'
    });

    $locationProvider.html5Mode(true);
})
Run Code Online (Sandbox Code Playgroud)

在html head中添加基本标记

<html>
<head>
    <meta charset="utf-8">    
    <base href="/">
</head>
Run Code Online (Sandbox Code Playgroud)

感谢@plus - 详细说明上述答案


小智 30

尝试

$locationProvider.html5Mode(true)
Run Code Online (Sandbox Code Playgroud)

更多信息,请访问 $ locationProvider
使用$ location

  • 对不起,我添加.config(函数($ locationProvider){$ locationProvider.html5Mode(true)})但我有结果index.html#%2Fhome不是index.html/home (6认同)

zer*_*ool 12

以下信息来自:https:
//scotch.io/quick-tips/pretty-urls-in-angularjs-removing-the-hashtag

获取干净的URL并从Angular中的URL中删除主题标签非常容易.
默认情况下,AngularJS将使用标签路由URL.例如:

有两件事需要做.

  • 配置$ locationProvider

  • 为相关链接设置基础

  • $ location服务

在Angular中,$ location服务解析地址栏中的URL并对您的应用程序进行更改,反之亦然.

我强烈建议您阅读官方Angular $位置文档,以了解位置服务及其提供的内容.

https://docs.angularjs.org/api/ng/service/$location

$ locationProvider和html5Mode

  • 我们将使用$ locationProvider模块并将html5Mode设置为true.
  • 我们将在定义Angular应用程序和配置路由时执行此操作.

    angular.module('noHash', [])
    
    .config(function($routeProvider, $locationProvider) {
    
       $routeProvider
           .when('/', {
               templateUrl : 'partials/home.html',
               controller : mainController
           })
           .when('/about', {
               templateUrl : 'partials/about.html',
               controller : mainController
           })
           .when('/contact', {
               templateUrl : 'partials/contact.html',
               controller : mainController
           });
    
       // use the HTML5 History API
       $locationProvider.html5Mode(true); });
    
    Run Code Online (Sandbox Code Playgroud)

什么是HTML5 History API?它是使用脚本操作浏览器历史记录的标准方法.这使Angular可以更改页面的路由和URL,而无需刷新页面.有关这方面的更多信息,这里有一个很好的HTML5 History API文章:

http://diveintohtml5.info/history.html

设置相对链接

  • 要使用相对链接链接您的应用程序,您需要<base><head>文档中设置.这可能位于Angular应用的根index.html文件中.找到<base>标记,并将其设置为您希望应用的根网址.

例如: <base href="/">

  • 还有很多其他方法可以配置它,HTML5模式设置为true应该自动解析相对链接.如果您的应用程序的根目录与url不同(例如/ my-base,则使用它作为基础.

旧浏览器的后备

  • 对于不支持HTML5 History API的浏览器,$ location服务将自动回退到hashbang方法.
  • 这对您来说是透明的,您不必为它配置任何工作.从Angular $位置文档中,您可以看到回退方法及其工作原理.

结论

  • 这是获取漂亮网址并删除Angular应用程序中的主题标签的简单方法.玩得那么超级干净,超级快速的Angular应用程序!